应广PMS154C(1)--11位PWM输出

概述

作者在以前已经讲解完PMS171B端口输出高低电平,PWM输出,在所用的PMS154C芯片有个为11位PWM输出,就写个11位PWM例程,方便大家快速上手。
这里选用8PIN的单片机进行开发,引脚如下图所示,选取7号管脚进行开发。

  • 若使用PA5输出PWM,需要上拉电阻。

    在这里插入图片描述
    在这里插入图片描述

PMS171B之PWM配置

在这里插入图片描述
pwmg0c寄存器是配置PWMG0控制,所以需要开启OWMG0,同时输出到PA0,时钟选择IHRC,故配置如下:

	pwmg0c = 0b_1000_011_1;

在这里插入图片描述
pwmg0s寄存器是配置PWMG0分频。
在这里插入图片描述
上述寄存器为计数寄存器和占空比寄存器。

PWM计算与配置

在这里插入图片描述
在本文中我们设置输出为38kHz,三分之一占空比的PWM载波,根据上图公式,F为16M,需要输出PWM 为38kHz,故:
38k = 16M÷[P * (K+1) * CB]
求得[P * (K+1) * CB]需要等于421,设置P分频为1,即pwms[6:5]=00,设置K为4,即pwms[4:0]=0100,所以CB为84,即Counter_Bount[10:1]=00 0101 0100,代码配置如下:

/*b7@0=PWMG0 中断模式
	b6:5@0=PWMG0 预分频 
			00:÷1  
			01:÷4
			10:÷16
			11:÷64
	b4:0@0100=PWMG0 分频。*/
		pwmg0s = 0b_0_00_00100;
/***********计数器寄存器******************/
//PWMG0  计数上限高位寄存器,PWMG0 上限寄存器。位[10:3]。
		pwmg0cubh = 0b_0001_0101;
//PWMG0  计数上限低位寄存器
/*b7:6@00=PWMG0 上限寄存器。位[2:1]。
	b5:0@00000=保留*/
		pwmg0cubl = 0b_0000_0000;

在这里插入图片描述
由上图可知,计时器Counter_Bount[10:0] = {pwmgxcubh[7:0], 所以Counter_Bount[10:0] = 000 1010 1000,转化为十进制为168。
占空比可通过修改Duty[10:0]来改变,Duty_Bound[10:0] = {pwmgxdth[7:0],pwmgxdtl[7:5]} ,如果需要设置三分之一的占空比,即168/3=56,所以Duty[10:0] = 000 0011 1000,pwmgxdth[7:0]配置为0000 0111,pwmgxdtl[7:5]配置为000,如下:

/***********占空比寄存器******************/
//PWMG0  占空比低位寄存器
/*b7:5@000=PWMG0 上限寄存器。位[2:1]。
	b5:0@00000=保留*/
		pwmg0dtl = 0b_0000_0000;
//PWMG0  占空比高位寄存器。位[10:3]。
		pwmg0dth = 0b_0000_0111;

11位PWM输出完整代码

#include	"extern.h"
void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/4		//	SYSCLK=IHRC/4
	clkmd.En_WatchDog	=	1;		//	WatchDog Enable
/*b7@1=启用 PWMG0。0/1:停用/启用
	b6@0=PWMG0 生成器输出状态。
	b5@0=选择 PWMG0 的输出的结果是否反极性。
	b4@0=PWMG0 计数器清零。
	b3:1@ 011=选择 PWMG0 输出引脚:011 PA0
	b0@1=PWMG0 时钟源。0: CLK*2,1:IHRC*2*/
		pwmg0c = 0b_1000_011_1;
/*b7@0=PWMG0 中断模式
	b6:5@0=PWMG0 预分频 
			00:÷1  
			01:÷4
			10:÷16
			11:÷64
	b4:0@0100=PWMG0 分频。*/
		pwmg0s = 0b_0_00_00100;
/***********计数器寄存器******************/
//PWMG0  计数上限高位寄存器,PWMG0 上限寄存器。位[10:3]。
		pwmg0cubh = 0b_0001_0101;
//PWMG0  计数上限低位寄存器
/*b7:6@00=PWMG0 上限寄存器。位[2:1]。
	b5:0@00000=保留*/
		pwmg0cubl = 0b_0000_0000;

/***********占空比寄存器******************/
//PWMG0  占空比低位寄存器
/*b7:5@000=PWMG0 上限寄存器。位[2:1]。
	b5:0@00000=保留*/
		pwmg0dtl = 0b_0000_0000;
//PWMG0  占空比高位寄存器。位[10:3]。
		pwmg0dth = 0b_0000_0111;

	while (1)
	{
		wdreset;
.delay 2000*10;
	}
}

演示效果

如下图所示,频率为37.6kHz,占空比为33.83%,配置成功。
在这里插入图片描述

最后

关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!
在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值