//********************************************************************************//
// 功能名称: 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,控制渐变时长
}
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;
}
应广单片机8位PWM呼吸灯代码
于 2023-11-03 11:04:55 首次发布