合泰杯——合泰单片机工程7之PWM输出

合泰杯——合泰单片机工程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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注