//********************************************************************************//
// 功能名稱: TM2/TM3產生PWM漸變(呼吸燈功能)
// 適應芯片: 只有TM2的芯片:
// PMS系列:PMS130 PMS131 PMS232 PMS164 PMS154C PMS171B
//--------------------------------------------------------------------------------//
//程序說明:
// 設置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,控制漸變時長
}
else//PWM遞減
{
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;
}
|