📄 pwm.c
字号:
//pwm.c
//
#include "AppDefine.h"
void PWM_init(void)
{
//CMOD
//Bit 7 6 5 4 3 2 1 0
//Symbol CIDL WDTE - - - CPS1 CPS0 ECF
//Bit 0 0 0 0 0 1 0 0
//CCON,可位
//Bit 7 6 5 4 3 2 1 0
//Symbol CF CR - CCF4 CCF3 CCF2 CCF1 CCF0
//Bit 0 0 0 0 0 0 0 0
//CCAPM0
//Bit 7 6 5 4 3 2 1 0
//Symbol - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
//8-bit PWM 0 1 0 0 0 0 1 0
CMOD = 0x04; //不使能中断,采用Timer0计数器,实现频率
CCON = 0x00; //溢出标志,软件清零
CCAPM0 = 0x42; //pwm
CCAPM1 = 0x42;
//频率 由PCA的Timer源来决定
TMOD |= 0x02; //TMOD: timer 0, mode 2, 8-bit reload
TL0 = 0xfb; //
TH0 = TL0;
//初值
//在PWM 模式,输出的频率决定于PCA定时器的源。
//由于只有一对CH 和CL寄存器,所有模块共享PCA定时器和频率。
//输出的占空比由装在高位CCAPnH的值控制。
//由于写入CCAPnH寄存器不是同步的,写入高位的值不会马上装入CCAPnL做比较,
//直到输出的另一个周期(当CL从255到0翻转)。
//用下面的公式计算任何占空比CCAPnH 值:
//CCAPnH=256(1-占空比)
//CCAPnH 是8 位整数,占空比是分数。
CL = 0x00;
CH = 0x00;
CCAP0L = 0x00;
CCAP0H = 0x7f;//PrePlusVol//占空比=256*50%
CCAP1L = 0x00;
CCAP1H = 0x7f;//PrePlusVol//占空比=256*50%
}
unsigned char PWM_status(void)
{
unsigned char ctime;
ctime = CL;
_nop_();_nop_();
_nop_();_nop_();
if(ctime == CL)
return 0;//没有PWM
else
return 1;
}
void PWM_run(void)
{
TR0 = 1; // timer 0 run
CR = 1; //run PCA
}
void PWM_stop(void)
{
TR0 = 0; // timer 0
CR = 0;
}
void PWM_changfreq(unsigned short freq)
{
/*
204 238 ee
217 239 ef
227 240 f0
244 241
263 242
286 243
303 244
333 245
370 246
416 247
476 248
526 249
625 250
740 251
926 252
1220 253
1852 254 fe
*/
unsigned char time0;
if(freq < 200)
time0 = 0xee;
else if(freq < 217)
time0 = 0xee;
else if(freq < 227)
time0 = 0xef;
else if(freq < 217)
time0 = 0xf0;
else if(freq < 227)
time0 = 0xef;
else if(freq < 244)
time0 = 0xf0;
else if(freq < 263)
time0 = 0xf1;
else if(freq < 286)
time0 = 0xf2;
else if(freq < 303)
time0 = 0xf3;
else if(freq < 333)
time0 = 0xf4;
else if(freq < 370)
time0 = 0xf5;
else if(freq < 416)
time0 = 0xf6;
else if(freq < 476)
time0 = 0xf7;
else if(freq < 526)
time0 = 0xf8;
else if(freq < 625)
time0 = 0xf9;
else if(freq < 740)
time0 = 0xfa;
else if(freq < 926)
time0 = 0xfb;
else if(freq < 1220)
time0 = 0xfc;
else if(freq < 1852)
time0 = 0xfd;
else if(freq > 1852)
time0 = 0xfe;
TL0 = time0; //
TH0 = TL0; //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -