BS86D20C合泰芯片教程07——PWM输出
今天我们来看芯片的PWM输出,PWM输出自然需要一个引脚作为输出口,在这里我们选用芯片的PB6引脚,刚刚好也是LED的输出引脚,在输出的PWM占空比不同的时候不仅可以用示波器来抓取波形,也可以通过LED的亮度来简单看出占空比的变化,方便我们调试观察现象。

从上面的电路图不难看出这个引脚有多种功能,我们这里使用的不是默认的GPIO口,而是他的特殊功能,因此需要先看到芯片手册的77页,先来配置PB6作为PWM波形的输出引脚。这里我们有两种方法来配置寄存器,一是配置TMPC寄存器来使能:TMPC=0x10,方法二是直接位操作:PTM1PC0=1,然后再配置PWM的输出功能。
可能有朋友还记得在上一篇中我们配置的寄存器也可以配置PWM输出模式,只不过上次我们选用的是CTM简易定时器,这一次我们选择周期型定时器PTM,复杂程度不一样。让我们看到芯片手册107页,可以发现定时器PTM支持多种功能,这次使用的PB6也就是PTP1输出引脚。

接下来看到PTM定时器运行的结构图,不难发现这张图和上一篇CTM简易定时器类似,先配置时钟源,然后配置比较器,最后配置输出。知道大致流程后我们就开始配置相关寄存器,PTMnC0寄存器Bit7的计数器不需要使用,所以设置为0,Bit6-4的时钟配置为四分频系统时钟:fsys/4,Bit3的PTnON需要打开,这个是PTMn总开关,关闭则无法使用PTM的定时功能,Bit2-0为0,因此PTMnC0为0x00001000=0x08。
然后配置PTMnC1,Bit7-6配置为10,PWM输出模式,Bit5-4配置10,还是PWM输出,不选择单脉冲输出,这个触发一次输出一次。Bit3这里选择PWM输出低有效还是高有效,随便选择都可以,这里选择低有效。Bit2设置输出极性方向,随便设置都行,Bit1设置输入的接口,也随便设置,Bit0设置选择比较器,也是随便设置,在PWM输出没用到。因此PTMnC1配置为0x10101001=0xa9。

PTMnDL和DH寄存器都是只读寄存器,不需要配置,重点在PTMnAL/H和PTMnRPL/H寄存器,PTMnAL/H寄存器是PTMn CCRA寄存器,PTMnRPL/H是CCRP寄存器,看到芯片手册的114页的PWM输出模式我们可以发现,CCRA是控制PWM的周期,CCRP是控制占空比,现在我们来配置随便一个PWM,CCRA配置为50,CCRP配置为1000。
周期计算公式:Duty=CCRA/CCRP=1/20
占空比计算公式:F=CLK/CCRP=8M/4/1000=2K
理论上来说周期为2k,占空比1/20,用示波器抓取波形可以验证波形是正确的,LED这里就不过多展示。

代码如下所示,如果没有示波器可以调占空比观察LED亮度测试代码。
#include "BS86D20C.h"
//pwm输出
int main()
{
_pbc6=0;//配置输出引脚
_tmpc=0x10;//tpmc寄存器,配置ptp和ctp引脚使能,这里是配置PB6
// _ptm1pc0=1;//这样单独配置引脚pb6也行
_ptm1c0=0x08;//PTMnC0寄存器,clk=sys/4
_ptm1c1=0xa9;//PTMnC1寄存器,pwm模式(除这个外后面可以随便配置),低有效,同向,PTCKn引脚,比较器A
_ptm1al=0x30;//CCRA,Duty=CCRA/CCRP=50/1000=1/20
_ptm1ah=0x00;
_ptm1rpl=0xE8;//CCRP,f=clk/CCRP=sys/4/1000=2k,配置为2Khz
_ptm1rph=0x03;
while(1)
{
_clrwdt();//喂狗
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)