打印
[合泰杯HT32讨论区]

合泰单片机工程之PWM输出

[复制链接]
1079|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kzlzqi|  楼主 | 2023-2-27 01:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言
时隔一年,再继续跟最后一篇的合泰杯系列,希望这个教程能够帮助到你们。之前上一讲介绍的内容是定时器中断,这一讲我们来使用PWM输出,预计实现的效果为呼吸灯。这是一个最简单的PWM输出的例程了,实验起来的条件也比较方便。
提示:以下是本篇文章正文内容,下面案例可供参考

一、合泰系列的PWM实现方式?
看技术手册可以知道,这一系列的单片机有7个定时器且每个定时器都有不同的类型,分别是标准型(STM)和周期型(PTM),它们的区别如下图:


使用特权

评论回复

相关帖子

沙发
kzlzqi|  楼主 | 2023-2-27 01:38 | 只看该作者
好吧,看图片是没有什么区别的功能都一样,太久远了,已经忘了区别在哪了。

其实不管是STM还是PTM都是可以实现PWM波的输出的。这里我介绍一下怎么用PTM实现PWM的输出。
————————————————

版权声明:本文为CSDN博主「yijianpeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/newpeopie/article/details/114781002

使用特权

评论回复
板凳
kzlzqi|  楼主 | 2023-2-27 01:39 | 只看该作者
PTM输出PWM波

使用特权

评论回复
地板
kzlzqi|  楼主 | 2023-2-27 01:39 | 只看该作者
看到手册上关于PWM输出模式的描述,我们可以得出几点关键的信息:

1.要输出PWM, PTMnC1 寄存器中的 PTnM1 和 PTnM0 位需要设置为“10”;
2.PWM 波形的周期和占空比由 CCRP 和 CCRA 寄存器的值控制,CCPR控制周期,CCRA控制 PWM波的占空比;
3.PTMnC1 寄存器的 PTnOC 位选择 PWM 波形的极性
4.PTnIO1 和 PTnIO0 位使能 PWM 输出或强制 TM 输出脚为高电平或低电平

使用特权

评论回复
5
kzlzqi|  楼主 | 2023-2-27 02:03 | 只看该作者
下面我们来看一下周期和占空比应该是如何计算的:

使用特权

评论回复
6
kzlzqi|  楼主 | 2023-2-27 02:03 | 只看该作者
PWM波的频率=(TM时钟源频率 /CCRP的值);占空比=(CCRA/CCRP),TM时钟源频率是我们要初始化定时器的时候要设定的。PWM输出模式的时序图如下。

使用特权

评论回复
7
kzlzqi|  楼主 | 2023-2-27 02:03 | 只看该作者
具体实现过程
下面我根据我的这个实验,走一遍基本的配置过程。我选择的PTM3,是一个16位的定时器。

使用特权

评论回复
8
kzlzqi|  楼主 | 2023-2-27 02:20 | 只看该作者
2.1配置PTM3C0和PTM3C1
先配置PTM3C0,看到寄存器的描述如下:

使用特权

评论回复
9
kzlzqi|  楼主 | 2023-2-27 02:20 | 只看该作者

使用特权

评论回复
10
kzlzqi|  楼主 | 2023-2-27 02:21 | 只看该作者
第7位是定时器的运行控制位,为0时定时器正常工作,为1时定时器停止计数,也就是停止运行,这里我们需要定时器不断的工作,需要设置此位为0;当然了,什么时候可以设置为1?当你不需要PWM波是就可以设置此位为1了。
第6~4位是选择PTM的时钟源,我们的系统时钟是应该是外部的8MHz的时钟,我们设置为000,选择8MHz/4,即2MHz。
第3位控制PTM的总开关,也就是定时器的使能位,这个跟上面的第7位很像,但是会清零计数器,第7位的不会。
第2~0位则是未定义
所以我们应该设置的是**_ptm3c0=0b00001000;**

使用特权

评论回复
11
kzlzqi|  楼主 | 2023-2-27 02:21 | 只看该作者
配置PTM3C1,寄存器的描述如下:

使用特权

评论回复
12
kzlzqi|  楼主 | 2023-2-27 02:22 | 只看该作者
第7~6位选择定时器的工作模式;我们是PWM波输出,所以选择的是10,也就是PWM输出模式;

使用特权

评论回复
13
kzlzqi|  楼主 | 2023-2-27 02:27 | 只看该作者
第5~4位是控制PWM的引脚输出模式的,00是输出引脚无效状态,01是输出有效状态,10是PWM输出。那什么是无效和有效状态,这个我们在下一位会定义到的。这里我们选择的是10,也就是PWM输出。

使用特权

评论回复
14
kzlzqi|  楼主 | 2023-2-27 02:27 | 只看该作者
第3位就是设置有效位的,我们设置的是高有效,也就是1;

使用特权

评论回复
15
kzlzqi|  楼主 | 2023-2-27 02:27 | 只看该作者
第2位就是设置PTPn引脚是否应该反向,这是什么意思呢?我们知道PTP3是我们要输出PWM的那个引脚,然后我们又设置的是高电平有效,然后PWM输出,同相的意思是引脚的输出跟我们设置的相同,应该输出高电平就输出高电平,反相则是输出高电平实际上却输出低电平。我们设置为同相就可以了。
第1~0位,PWM模式下用不到。
所以我们应该设置的是**_ptm3c0=0b10101000;**

使用特权

评论回复
16
kzlzqi|  楼主 | 2023-2-27 02:27 | 只看该作者
代码如下(示例):
    _ptm3c0=0b00001000;           //时钟选择为8MHz/4,即2MHz,也就是0.5us
    _ptm3c1=0b10101000;    //功能选择寄存器,选择PWM输出且低有效

使用特权

评论回复
17
kzlzqi|  楼主 | 2023-2-27 02:28 | 只看该作者
## 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;                //开启总中断
           
}

使用特权

评论回复
18
kzlzqi|  楼主 | 2023-2-27 02:28 | 只看该作者
2.3PWM的输出引脚功能选择

使用特权

评论回复
19
kzlzqi|  楼主 | 2023-2-27 02:29 | 只看该作者
发现PB2和PD4都是可以作为PWM波的输出引脚的,然后我设置的是PB2,其配置如下:

使用特权

评论回复
20
kzlzqi|  楼主 | 2023-2-27 02:29 | 只看该作者
第5~4位配置为11;所以是上面的程序的 _pbs0=0b00110000; //PTP3引脚选择,接的是B2
然后在配置一下输出模式就OK了。
所以PWM输出的配置到这里就结束了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

477

帖子

2

粉丝