計數器的介紹
對于應廣單片機來說,它提供了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;
}