计数器的介绍
对于应广单片机来说,它提供了3种计数器,分别为 TM2\TM3\T16
其中对于TM2\TM3来说,是属于PWM计数器,用法是简单的,但是要求比较高,需要对应的引脚来达到它的要求
从芯片手册上,可以看到有且最多只能是6个引脚受到TM2\TM3控制,这时候就需要用到T16时钟进行计时,
控制芯片引脚传出PWM波形,控制灯的明暗呼吸效果
看门狗计数器
看门狗计数器是一个定时器,其时钟源来自内部低频振荡器(ILRC)。利用 misc 寄存器的选择,可以设定三
种不同的看门狗计数器超时时间,它们是:
当 misc[1:0]=10 时:16384 个 ILRC 时钟周期
当 misc[1:0]=01 时: 4096 个 ILRC 时钟周期
当 misc[1:0]=01(默认) 时:2048 个 ILRC 时钟周期
ILRC 的频率有可能因为工厂制造的变化, 电源电压和工作温度而漂移很多; 使用者必须预留安全操作范
围。为确保看门狗计数器在超时溢出周期之前被清零,在安全时间内,用指令“wdreset”清零看门狗计数器。在上
电复位或任何时候使用 wdreset 指令,看门狗计数器都会被清零。当看门狗计数器超时溢出时,PMC156/PMS156
将复位并重新运行程序。请特别注意,由于生产制程会引起 ILRC 频率相当大的漂移,上面的数据仅供设计参考
用,还是需要以各个单片机测量到的数据为准。
看门狗计数器超时溢出的相关时序
功能名称: TM2/TM3产生PWM渐变
功能编号: 020104
适应芯片: 只有TM2的芯片:
PMC系列:PMC234
PMS系列:PMS234 PMS150C PMS150G PMS152 PMS15A
TM2和TM3都有的芯片:
PFC系列:PFC151 PFC154 PFC232 PFC161
PFS系列:PFS154 PFS172 PFS173 PFS122 PFS123
PMC系列:PMC131 PMC232
PMS系列:PMS130 PMS131 PMS232 PMS164 PMS154C PMS171B PMS132B PMS133 PMS134
程序说明:
设置TM2或PB3从PB2脚产生3906.25Hz的频率
初始关闭TM2或TM3做到0%的占空比,
然后打开TM2或TM3开始调节占空比至100%
再调节占空比至最低,关掉TM2或TM3做到0%,然后重复做到渐变
通过增加TM2B或TM3B的值使占空比不断增加
通过减少TM2B或TM3B的值使占空比不断减少
注意事项:
1.案例为PMS154C,其他芯片时钟源和输出IO脚可能存在不同,其他原理都相同
#include "extern.h"
void TM2_Init(void)设置频率
{
$ TM2C SYSCLK,PB2,PWM; 选择时钟源,输出脚,PWM模式,是否反极性输出(写Inverse为启用,不写则为停用)
根据要求时钟可选择SYSCLK, EOSC, IHRC, ILRC等,输出脚可以选择Disable(不选择), PB2, PB4, PA3
注:时钟源与输出脚位的选择请参考对应芯片的datasheet,个别芯片有些不同
$ TM2S 8bit,/1,/1; 选择分辨率,预分频,分频
分辨率可选择8bit,6bit,预分频可选择/1, /4, /16, /64,分频可选择/1 ~ /32(对应TM2S[4:0]的00000 ~ 11111)
TM2B = 0; 1/256的亮度
PWM模式的频率和占空比计算
频率=时钟源/(分辨率*预分频*分频)=1M / (2^8 * 1 * 1) = 3906.25Hz
占空比=(TM2B+1)/分辨率*100%=(0 + 1) / 2^8 *100% = 1/256*100% = 0.38%
$ TM2C Stop; 关闭PWM,即0%的亮度
}
除脚位不同,其他原理和TM2一样
void TM3_Init(void)
{
$ TM3C SYSCLK,PB5,PWM; 输出脚可选择Disable(不选择),PB5, PB6, PB7
注:时钟源与输出脚位的选择请参考对应芯片的datasheet,个别芯片有些不同
$ TM3S 8bit,/1,/1;
TM3B = 0; 1/256的亮度
$ TM3C Stop; 关闭PWM,0%的亮度
}
bit Add_Sign;
byte PWM_Num;
void PWM_Grad(void)
{
if(Add_Sign)PWM递增
{
$ TM2C SYSCLK,PB2,PWM;打开PWM
$ TM3C SYSCLK,PB5,PWM;
PWM_Num++;每次增加1/256
TM2B = PWM_Num;
TM3B = PWM_Num;
if(PWM_Num == 255)如果亮度100%,开始递减
{
Add_Sign = 0;
}
.delay 10000;延时10ms,控制渐变时长
}
elsePWM递减
{
PWM_Num--;
TM2B = PWM_Num;
TM3B = PWM_Num;
if(PWM_Num == 0)亮度1/256,不是全灭
{
$ TM2C Stop;关闭PWM来实现0%亮度
$ TM3C Stop;
Add_Sign = 1;
}
.delay 10000;
}
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;
PWM_Num = 0;
Add_Sign = 1;
TM2_Init();
TM3_Init();
while (1)
{
PWM_Grad();
}
}
void Interrupt (void)
{
pushaf;
if (Intrq.T16)
{ T16 Trig
User can add code
Intrq.T16 = 0;
...
}
popaf;
}