合泰杯——合泰单片机工程7之PWM输出
前言
时隔一年,再继续跟最后一篇的合泰杯系列,希望这个教程能够帮助到你们。之前上一讲介绍的内容是定时器中断,这一讲我们来使用PWM输出,预计实现的效果为呼吸灯。这是一个最简单的PWM输出的例程了,实验起来的条件也比较方便。
提示:以下是本篇文章正文内容,下面案例可供参考
一、合泰系列的PWM实现方式?
看技术手册可以知道,这一系列的单片机有7个定时器且每个定时器都有不同的类型,分别是标准型(STM)和周期型(PTM),它们的区别如下图:
好吧,看图片是没有什么区别的功能都一样,太久远了,已经忘了区别在哪了。
其实不管是STM还是PTM都是可以实现PWM波的输出的。这里我介绍一下怎么用PTM实现PWM的输出。
二、PTM输出PWM波
看到手册上关于PWM输出模式的描述,我们可以得出几点关键的信息:
1.要输出PWM, PTMnC1 寄存器中的 PTnM1 和 PTnM0 位需要设置为“10”;
2.PWM 波形的周期和占空比由 CCRP 和 CCRA 寄存器的值控制,CCPR控制周期,CCRA控制 PWM波的占空比;
3.PTMnC1 寄存器的 PTnOC 位选择 PWM 波形的极性
4.PTnIO1 和 PTnIO0 位使能 PWM 输出或强制 TM 输出脚为高电平或低电平
下面我们来看一下周期和占空比应该是如何计算的:
PWM波的频率=(TM时钟源频率 /CCRP的值);占空比=(CCRA/CCRP),TM时钟源频率是我们要初始化定时器的时候要设定的。PWM输出模式的时序图如下。
)
二、具体实现过程
下面我根据我的这个实验,走一遍基本的配置过程。我选择的PTM3,是一个16位的定时器。
2.1配置PTM3C0和PTM3C1
先配置PTM3C0,看到寄存器的描述如下:
第7位是定时器的运行控制位,为0时定时器正常工作,为1时定时器停止计数,也就是停止运行,这里我们需要定时器不断的工作,需要设置此位为0;当然了,什么时候可以设置为1?当你不需要PWM波是就可以设置此位为1了。
第6~4位是选择PTM的时钟源,我们的系统时钟是应该是外部的8MHz的时钟,我们设置为000,选择8MHz/4,即2MHz。
第3位控制PTM的总开关,也就是定时器的使能位,这个跟上面的第7位很像,但是会清零计数器,第7位的不会。
第2~0位则是未定义
所以我们应该设置的是**_ptm3c0=0b00001000;**
配置PTM3C1,寄存器的描述如下:
)
第7~6位选择定时器的工作模式;我们是PWM波输出,所以选择的是10,也就是PWM输出模式;
第5~4位是控制PWM的引脚输出模式的,00是输出引脚无效状态,01是输出有效状态,10是PWM输出。那什么是无效和有效状态,这个我们在下一位会定义到的。这里我们选择的是10,也就是PWM输出。
第3位就是设置有效位的,我们设置的是高有效,也就是1;
第2位就是设置PTPn引脚是否应该反向,这是什么意思呢?我们知道PTP3是我们要输出PWM的那个引脚,然后我们又设置的是高电平有效,然后PWM输出,同相的意思是引脚的输出跟我们设置的相同,应该输出高电平就输出高电平,反相则是输出高电平实际上却输出低电平。我们设置为同相就可以了。
第1~0位,PWM模式下用不到。
所以我们应该设置的是**_ptm3c0=0b10101000;**
代码如下(示例):
_ptm3c0=0b00001000; //时钟选择为8MHz/4,即2MHz,也就是0.5us
_ptm3c1=0b10101000; //功能选择寄存器,选择PWM输出且低有效
## 2.2设置PWM波的频率和占空比 我们要求是要实现一个呼吸灯的效果,所以占空比是要不断的改变的,所以我可利用了一个形参来写入,然后频率我们设置为80KHz,具体的写法如下: Period的值在主函数里面设置为25,根据公式计算也就是2000000/25=80000;
void PWM_Init(unsigned long Period,unsigned long Duty)
{
_ptm3c0=0b00001000; //时钟选择为8MHz/4,即2MHz,也就是0.5us
_ptm3c1=0b10101000; //功能选择寄存器,选择PWM输出且低有效
_ptm3rph=Period/256; //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
_ptm3rpl=Period%256; //周期频率为8MHz/4/Period
_ptm3ah =Duty/256; //占空比设置,大小为Duty/Period
_ptm3al =Duty%256;
_pbs0=0b00110000; //PTP3引脚选择,接的是B2
_pbc2=0;
_pb2=0;
_emi=1; //开启总中断
}
2.3PWM的输出引脚功能选择
发现PB2和PD4都是可以作为PWM波的输出引脚的,然后我设置的是PB2,其配置如下:
第5~4位配置为11;所以是上面的程序的 _pbs0=0b00110000; //PTP3引脚选择,接的是B2
然后在配置一下输出模式就OK了。
所以PWM输出的配置到这里就结束了。
2.4呼吸灯的主程序
通过不断的延迟改变占空比就达到了一个呼吸灯的效果了。占空比是先加后减的。
#include "HT66F2390.h"
#include "led.h"
#include "delay.h"
#include "pwm.h"
void main()
{
int k=0,i=0;
LED_Init();
while(1)
{
_wdtc=0b10101011;
if(k==0)
{
for(i=0;i<26;i++)
{
delay_ms(100);
PWM_Init(25,i); //周期频率为80KHz,占空比不断增加%
}
k=1;
}
else
{
for(i=26;i>0;i--)
{
delay_ms(100);
PWM_Init(25,i); //周期频率为80KHz,占空比不断减小%
}
k=0;
}
}
}
总结
至此,合泰系列就正式结束了,没有写什么有用的东西,然后文笔也比较稚嫩,希望能够在比赛上帮助到各位师弟师妹们!祝比赛顺利,然后整个系列的代码如下(PWM的也包含在里面,没怎么整理,望谅解):
链接: https://pan.baidu.com/s/1liihSQat5pmhQdNaTYGD7g 提取码: 1111
今天的文章合泰杯——合泰单片机工程7之PWM输出分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67361.html