脉冲宽度调制(PWM),是利用微处理器的数字输出来对模拟电路调控的手段,实例如:对小车轮子的速度或者说舵机的角度、拖尾流水灯一类的调控等。
简单介绍一下,STM32F1系列共有8个定时器:高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。
STM32F4 系列是有15个定时器 多加通用定时器 TIM9~TIM14。
每个通用定时器都有四个通道来作为:输出捕获,输出比较,PWM输出,单脉冲模式等。
除了TIM6和TIM7(基本定时器)外,都可以产生PWM输出 高级定时器TIM1、TIM8可以同时产生七路的PWM输出。
图中标注的是PWM输出模式的CNT(计数器当前值)、ARR(自动重装载值)、CCRx(捕获/比较寄存器值)。,
由CNT和CCRx的大小比较来 判断TIMx_CHx通道输出高低电平。
当CNT小于CCRx时,TIMx_CHx通道输出低电平;
当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
该图是向上计数模式的例子:
定时器从0开始向上计数,由CCRx的值作为分界线,当TIMx_CNT数值高时输入高电平,数值低时输入低电平,到达ARR时溢出从新计数,反复循环...
也就是说 ARR确定PWM的频率,CCRx确定占空比。
可以设置PWM的模式来确定向上计数,向下计数。
下面是利用这个原理对小车轮子速度和舵机角度进行的调整,代码部分是标准库。
初始化定时器 TIM3,TIM4并且开启时钟,我这里电机驱动用的是TIM3,舵机是TIM4.
然后配置IO口,毕竟是受内部外设控制,所以就复用推挽输出。
再调用内部时钟,配置时基单元参数,设置向上计数模式,定时器分不分频其实无所谓,这个配置流程中的psc预分频的时候已经设置了,然后就是设置ARR触发中断停止计数,初始化单元,这个环节是PWM中很重要的一步。
拿第二部分 舵机的时基单元参数的配置来说。
我用的STM32F103系列 时钟频率本身是72MHZ,预分频值降速到10的-6次方再乘以ARR自动重装载值就是2ms一运行周期,这其中的作用嘛,下面找的两个舵机图就比较生动形象。
看似舵机和电机的配置很像,但也就是这关键的两个地方当初让我烦恼很久,我把两个合并为一个,舵机能动的时候轮子不能动,轮子能动的时候舵机不能动.....
这里就是选择向上计数,超出CCR的部分输出高电平,然后输出使能。
通俗点来说,就是ARR确定上限,这一步设置这个曲线从0开始随时间递增。
PWM1模式1(向上计数):计数器从0计数然后加到自动重装载值(TIXx—_ARR),然后重新从0开始递增,并且产生一个计数器溢出事件
PWM2 模式2(向下计数):计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载(TIMx_ARR)开始递减,并且产生一个计数器
定时器通道的初始化,CCR自动重装,开启预装载,定时器使能,都是一些必要的步骤。
不同定时器CCR的初始化,然后电机和舵机具体到各个c文件中调节。
PWM的使用流程基本就是这样的,用的时候可以复制下来改一改就可以。
下面就是各个C文件中的一些调节部分。
舵机到最后具体的角度就是根据占空比,后续设置的CCR值来调整。
占空比:重载寄存器TIMx_ARR配置为N;
比较寄存器TIMx_CCR预先存储A;
PWM的占空比为A/(N+1)。
这个是设置电机右轮的一个PWM中调整CCR的地方
ARR自动重装载值是100嘛,所以范围也是在100以内。
对于PWM实施在小车和舵机上的结果,很难以动态展示这里就放一下成品图吧
这里应该是超声波和舵机连接到一起的,成为一个避障小车,但是我想有更多一点的可能性,加了个不需要舵机的一个方案,所以这个图片是这样的。