html做网站项目案例,做地坪网站,哪个网站做推广比较好,五个网站做STM32智能小车的实验中会用到定时器PWM输出#xff0c;来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理PWM(Pulse Width Modulation)#xff0c;也就是脉冲宽度调制。PWM中有一个比较重要的概念#xff0c;占空比#xf… 做STM32智能小车的实验中会用到定时器PWM输出来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理 PWM(Pulse Width Modulation)也就是脉冲宽度调制。 PWM中有一个比较重要的概念占空比是一个脉冲周期内有效电平在整个周期所占的比例。 为了实现IO口上电压的持续性变化可以调节PWM的占空比。这也能够使外设的功率进行持续性变化最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。 上图中的ARR是我们给定时器的一个预装载值CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6)ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5)则改变CCRx的值就能改变输出PWM的占空比。因此想要控制PWM的输出波形重要的就是如何设置ARR与CCRx这两个寄存器的值了。STM32定时器中断 为了便于理解接下来关于PWM应用的内容先插一段定时器中断的知识。 产生定时中断是定时器的用法之一与定时器用来进行PWM输出和输入捕获相比定时器中断更容易理解、掌握。原理简介 使用通用定时器进行中断的原理其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器)即用psc(预分频系数)设置好定时器时钟后arr(预装载值)在每个时钟周期内减1当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例void TIM3_Int_Init(u16 arr,u16 psc){ RCC-APB1ENR|11; //TIM3时钟使能 TIM3-ARRarr; //设定计数器自动重装值 TIM3-PSCpsc; //预分频器设置 TIM3-DIER|10; //允许更新中断 TIM3-CR1|0x01; //使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1子优先级3组2 }RCC-APB1ENR|11 解释一下上面这行代码由于定时器3(TIM3)是挂在APB1上的外设所以要打开APB1这里的预分频器值psc是来设置TIM3的时钟频率的如果系统时钟(SYSTICK)频率为72MHz、psc为7199则TIM3的时钟频率就为72MHz/(71991)Hz 10KHz //这里的“1”是手册中规定的。 10KHz是什 么意思呢就是一秒钟会产生10K个周期那么一个周期的时间长度就是1/10KHz如果你想将定时器中断的时间间隔设置为0.5秒那么你将arr设置为5000即可因为arr每减1就需要一个周期的时间减5000次就经过了5000*(1/10KHz)0.5秒。TIM3-DIER|10 再解释下上面这一行设置允许更新中断即arr减到0以后可以触发更新中断还有其他类型的中断。MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1子优先级3组2 看上面这行代码中断优先级有抢占优先级和响应(即子优先级)优先级两种抢占优先级即若程序1正在使用CPU这时如果程序2要求使用CPU并且程序2的抢占优先级高则CPU被程序2抢占若两者抢占优先级相同则就算程序2的响应优先级高于程序1CPU也不能被抢占若程序1正在使用CPU程序2和程序3的抢占优先级等于或低于程序1且程序2的响应优先级高于程序三则待CPU空出后程序2先运行程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的这是因为寄存器提供了四位来设置优先级组2代表的是前两位给抢占优先级后两位给响应优先级。PWM模式、有效电平 前面介绍完中断再说一下PWM工作原理。 假设上图中ARR大于CCRx时输出为高电平ARR小于CCRx时输出为低电平但在实际运用中可能并非如此有可能是相反的情况——ARR大于CCRx时输出为低电平ARR小于CCRx时输出为高电平至于到底是哪种情况还要看PWM是哪种模式、有效电平又设置的是何种极性了。模式1ARR小于CCRx时输出为“有效”电平ARR大于CCRx时输出为“无效”电平。模式2ARR小于CCRx时输出为“无效”电平ARR大于CCRx时输出为“有效”电平。 这里说的是“有效”和“无效”而不是“高”和“低”也就是说有效电平可高可低并非一定就是高电平。PWM模式、效电平极性需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。TIM1_PWM_Init(899,0);//不分频。PWM频率72000/(8991)80Khz 上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波这里的899设置的就是ARR的值至于那个0是用来设置TIM1的频率的不分频就代表TIM1的时钟频率和系统时钟相同这里假设为72MHz。void TIM1_PWM_Init(u16 arr,u16 psc){ //此部分需手动修改IO口设置 RCC-APB2ENR|111; //TIM1时钟使能 GPIOA-CRH0XFFFFFFF0; //PA8清除之前的设置 GPIOA-CRH|0X0000000B; //复用功能输出 TIM1-ARRarr; //设定计数器自动重装值 TIM1-PSCpsc; //预分频器设置 TIM1-CCMR1|74; //CH1 PWM2模式 TIM1-CCMR1|13; //CH1预装载使能 TIM1-CCER|01; //OC1 输出使能 //TIM1-CCER|11; TIM1-BDTR|115; //MOE 主输出使能 TIM1-CR10x0080; //ARPE使能 TIM1-CR1|0x01; //使能定时器1 } 下文具体分析上面的代码。 前面4-6行是用来配置GPIO口的。TIM1-ARRarr; //设定计数器自动重装值TIM1-PSCpsc; //预分频器设置 这两行就是我上门提到的设置定时器的频率和重装载值。TIM1-CCMR1|74; //CH1 PWM2模式TIM1-CCMR1|13; //CH1预装载使能TIM1-CCER|01; //OC1 输出使能 这三行是用来设置PWM输出模式和设置通道的通道是什么呢简单地讲就是输出PWM波的GPIO口代码一开始不是设置了PA8这个GPIO口嘛这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。TIM1-CCER|11; 这行代码是用来设置“有效电平”极性的根据手册当TIM1-CCER[1]这位置1时有效电平为低电平置0时有效电平为高电平而默认情况下置0。TIM1-BDTR|115; //MOE 主输出使能 这行代码只要对高级定时器进行设置普通定时器无需设置。TIM1-CR10x0080; //ARPE使能 这行代码是用来使能ARPEARPE是什么呢就是当它被置1时你自己设置的CCRx会立即生效如果它被置为0那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了)而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。上面的代码里没有对CCRx进行设置这是因为CCRx常常是一个变化的值你可以在主函数中用一个for循环if判断语句对它进行或–的操作从而达到连续改变CCRx值得目的例如for(i0;i300;i){ TIM1-CCR1i; if(i300){ i0; }} PWM波的周期是由定时器时钟频率和预装载值两者决定的预装载值就是ARR。 预装载值PSC设置为899那么当定时器的当前值val从0增加到899时一共经过了900个时钟周期这900个时钟周期会产生一个PWM波形也就是说900个定时器时钟周期才相当于一个PWM周期那么PWM的频率就为72MHz/90080KHz周期为1/80KHz。