本节主要学习定时器的输出比较功能,首先先看实验结果以及部分代码:
在上一节时基单元的代码基础上增加部分代码,第一个是增加灯的GPIO口的初始化代码:
然后就是输出比较部分的初始化代码:
此外增加一个PWM的值的输入函数:
在主函数中使用for循环实现灯从暗到亮再到暗,彷佛在呼吸
结果如下所示:
VID_20240727_175652
这个是通过PWM输出来模拟灯的亮度变化,主要由CCR的变化来决定
接下来就是本节的理论部分:
在上节也说过,这里的OC在基本定时器中没有,因此需要在通用或者高级中使用,当CNT在计数时,与CCR进行比较,当两者的值小于、等于、大于时,分别输出不同的结果为0或1,形成波形。
PWM的主要功能就是通过调节一定的占空比来实现不同的亮度、速度等变量,前提调节是惯性系统,即不会马上开启或者停下某一任务,过一段时间才会停或者开始。相当于在数字系统中等效输出模拟量。(个人理解就是可以实现将离散量变成近似的连续量)
占空比类似于模拟电压,例如,高电平5V,低电平0V,占空比此时是50%,则等效于电压2.5V;占空比为20%,则等效于1V。以此类推。
采用通用定时器作为示例:
输入条件为CNT>或者=CCR时,输入信号,之后是OC1REF参考信号,输出是REF的高低电平,之后分为两路,一路到主模式控制器,即可以映射到TRGO口,主要一路是下边的到CCE极性选择处,为0则输入什么输出什么,为1则输入什么进行反转,然后到输出使能通道决定是否输出信号。
之后是输出模式控制器的几种模式:
最常用的是向上计数,其中PWM1和PWM2是刚好相反的,等效于这一部分的一个极性选择。
接下来是本节重点:
右上角中蓝色是CNT,黄色是ARR,红色是CCR,而绿色就是PWM的输出REF的值,CCR决定的,REF是频率可调、极性可调的PWM波形,之后再经过极性选择是否输出使能,传到GPIO口输出可视化结果
接下来是参数计算:
其中PWM频率其实就是计数器溢出频率,占空比就是CCR的值比ARR的值+1,分辨率取决于ARR的值,相当于ARR越大,CCR越大。
如果此时输出一个1KHz,分辨率为1%的PWM波形,那么ARR的值为99,PSC的值为719。
之后就是用到的东西介绍:
实验如下:
VID_20240728_190132
可以看出,随着按键的变化,驱动舵机发生改变,使得输出为0——180°,每次变化30°,到了180后返回到0°。
之后是直流电机的介绍:
以上芯片的H桥,以TB6612电路图举例,当电路的左半部分的上边导通时,下边就断开,这样就接在了PGND的负极,(不能上下级同时导通,会导致电路短路,也不能同时断开,会导致出现高阻态),有两个这样的电路就构成了H桥,一般是左上+右下导通,电流就是从左流向右边,反之左下+右上,电流从右流向左边。H桥可以控制电流流过的方向,从而控制电机的正反转。
类比于上面的电路图,当输入都为高电平或者低电平时,电路不动,当左边IN1输入高电平,右边IN2输入低电平时,此时PWM控制输出电流,”高转低不转“,此时当PWN为高电平,输出O1为高电平,O2为低电平发生正传,PWM为低电平时制动,但当频率足够大时,就能保证其稳定的正转,反之依然。
今天在跑驱动直流电机代码的时候发现,软件运行后显示屏是正常输出的,但是驱动电机一点不转,然后就仔细检查了一遍线,后来发现,原来我的芯片是DRV8833,没有VCC和PWMN这两个口,就是没有直接输出PWM结果的口,而视频用的是TB6612,搜了半天这两个芯片的转换方式,没有找到,最终立马下单一个TB6612芯片,等待芯片回来再尝试驱动直流电机。