请问哪位大神有基于STM32的SVPWM控制程序,求小弟我参考一下~~

请问哪位大神有基于STM32的SVPWM控制程序,求小弟我参考一下~~,第1张

你说的是PWM事件生成吧

void PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure

TIM_OCInitTypeDef TIM_OCInitStructure

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE) //使能GPIO外设和AFIO复用功能模块时钟使能

//用于TIM3的CH2输出的PWM通过该LED显示

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING

GPIO_Init(GPIOA, &GPIO_InitStructure)

//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7//TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure)

//GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET)// PA7上拉

TIM_TimeBaseStructure.TIM_Period = arr//设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K

TIM_TimeBaseStructure.TIM_Prescaler =psc//设置用来作为TIMx时钟频率除数的预分频值 不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0//设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure)//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2//选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable//比较输出使能

TIM_OCInitStructure.TIM_Pulse = 0//设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High//输出极性:TIM输出比较极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure) //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable) //使能TIMx在CCR2上的预装载寄存器

TIM_ARRPreloadConfig(TIM3, ENABLE)//使能TIMx在ARR上的预装载寄存器

TIM_Cmd(TIM3, ENABLE) //使能TIMx外设

}

TIM_SetCompare2(TIM3,led0pwmval)

1、脉冲宽度

如下图所示,采集该高电平脉冲的宽度,只需要进入输入捕获上升沿检测,记录当前的发生上升沿时的CNT值,再进行输入捕获下降沿检测,也记录当前发生下降沿时的CNT值,两次CNT值的差值再根据计数的频率就可以算出脉冲的宽度。

上升沿及下降沿捕获的程序具体实现如下:

TIM8_Cap_Init(0XFFFF,72-1) //以1Mhz的频率计数

void TIM8_UP_IRQHandler(void)

{

if((TIM8CH4_CAPTURE_STA&0X80)==0) //还未成功捕获

{

if (TIM_GetITStatus(TIM8,TIM_IT_Update) != RESET)

{

if(TIM8CH4_CAPTURE_STA&0X40) //已经捕获到高电平了

{

if((TIM8CH4_CAPTURE_STA&0X3F)==0X3F) //高电平太长了

{

TIM8CH4_CAPTURE_STA"=0X80 //标记成功捕获了一次

TIM8CH4_CAPTURE_VAL=0XFFFF

}

else

TIM8CH4_CAPTURE_STA++ //捕获高电平后定时器溢出的次数++

}

}

}

TIM_ClearITPendingBit(TIM8,TIM_IT_Update) //清除中断标志位

}

void TIM8_CC_IRQHandler(void)

{

if((TIM8CH4_CAPTURE_STA&0X80)==0)

{

if(TIM_GetITStatus(TIM8,TIM_IT_CC4) != RESET) //捕获1发生捕

首先,对于基于STM32的超声波测距传感器,我们需要了解相关的硬件接口和通信协议,然后再进行相关程序的编写。一般来说,超声波测距传感器通过GPIO口或者外部中断口与STM32相连,然后通过STM32的定时器或者计数器进行信号的计数和处理。程序中需要定义相关的GPIO口、定时器或者计数器,以及外部中断的处理程序,并且需要控制超声波发送和接收的周期,计算距离,最后将距离输出。在Proteus中,我们可以通过模拟器来模拟整个过程,并且可以通过C语言模拟器来对程序进行调试和优化。我们需要将STM32和超声波传感器连接起来,并且定义相应的IO口,定时器和中断程序。通过模拟器和调试程序,我们可以验证程序的功能,并且对程序进行调优。在具体的编写中,我们需要参考STM32的文档和数据手册,了解相关的硬件细节和软件编程技巧,最终完成整个项目。总之,在对基于STM32的超声波测距传感器进行程序编写时,需要深入了解硬件细节以及相关的通信协议,掌握相关的C语言编程技巧,并且通过模拟器和调试程序来验证和优化程序的功能。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11169271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存