|
使用的是M16,8MHZ内部RC,与PWM部分相关的代码如下:
#define PWMDDR DDRD
#define PWMPOR PORTD
#define PWM1 7
#define PWM2 5
#define PWM3 4
#define PWM1_data OCR2
#define PWM2_data OCR1A
#define PWM3_data OCR1B
#define PWM_MAX 100
volatile unsigned char APWM;
volatile unsigned char BPWM;
volatile unsigned char CPWM;
void pwm_init(void)
{
APWM=0;BPWM=0;CPWM=0;
PWMDDR|=1<<PWM1|1<<PWM2|1<<PWM3;
/*初始化PWM*/
TCCR2|=1<<COM21|1<<WGM21|1<<WGM20|1<<CS22; // 匹配时清零(COM2A1:COM2A0)快速PWM模式(WGM22:21:20) PWM CLK /64
OCR2=0;
TCNT2=0;
TCCR1A|=_BV(COM1A1)|_BV(COM1B1)|_BV(WGM10); //比较匹配时清零(COM1A1:COM1A0 COM1B1:COM1B0)
TCCR1B|=_BV(CS11)|_BV(CS10)|_BV(WGM12); //8位快速PWM(WGM10:11:12) PWM CK/64
OCR1A=0;
OCR1B=0;
/*初始化PWM*/
}
void PWM_OUT(unsigned char P1,unsigned char P2,unsigned char P3)
{
const unsigned char PD[101]=
{
0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, //1
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //2
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, //3
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, //4
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, //5
55, 56, 57, 58, 59, 60, 61, 62, 63, 64, //6
66, 68, 70, 72, 74, 76, 78, 80, 82, 84, //7
88, 92, 96,100,104,108,112,116,120,124, //8
130,136,142,148,154,160,166,172,178,184, //9
191,198,205,212,219,226,233,240,247,255 //10
};
PWM1_data=PD[P1];
PWM2_data=PD[P2];
PWM3_data=PD[P3];
}
void int main(void)
{
pwm_init();
while(1)
{
……
……
PWM_OUT(APWM,BPWM,CPWM);
}
}
当 PWM_OUT(0,0,0);时,PWM相关引脚还是有毛刺出现。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|