AVR M8 IO口模拟PWM 为何超过3路波形就不对了
AVR M8 IO口模拟PWM 为何超过3路波形就不对了没有加其他程序时超过三路都没问题,加上NRF24L01什么的超过3路就时间不对了!
请问什么原因
#define PWM1_high PORTC |=(1<<0) //PWM1输出端口PORTC0
#define PWM1_low PORTC &=~(1<<0)
#define PWM1_IO DDRC |=(1<<0)
#define PWM2_high PORTC |=(1<<1) //PWM2输出端口PORTC1
#define PWM2_low PORTC &=~(1<<1)
#define PWM2_IO DDRC |=(1<<1)
#define PWM3_high PORTC |=(1<<2) //PWM2输出端口PORTC2
#define PWM3_low PORTC &=~(1<<2)
#define PWM3_IO DDRC |=(1<<2)
#define PWM4_high PORTC |=(1<<3) //PWM2输出端口PORTC3
#define PWM4_low PORTC &=~(1<<3)
#define PWM4_IO DDRC |=(1<<3)
unsigned int count,PWM_FRE;
unsigned int pwm1,pwm2,pwm3,pwm4;//,pwm5,pwm6;
void PWM_int(void)
{
PWM1_IO;
PWM1_low;
PWM2_IO;
PWM2_low;
PWM3_IO;
PWM3_low;
PWM4_IO;
PWM4_low;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
TCCR0=0x02;//内部时钟,8分频
TCNT0=0xF6;//初始值
pwm1=0; //PWM1初始占空比设定
pwm2=75; //PWM2初始占空比设定
pwm3=250; //PWM1初始占空比设定
pwm4=75; //PWM2初始占空比设定
PWM_FRE=500; //PWM频率设定
TIMSK=0x01;
}
//void PWM_Turn(void) //调整占空比
//{
//// if(count==PWM_FRE)
//// count=0;
//
// if(PINB.0==0&&pwm1>0)
// {
// if(PINB.0==1)
// {
// pwm1=pwm1-50;
//
// }
// }
//
// if(PINB.1==0&&pwm1<300)
// {
// if(PINB.1==1)
// {
// pwm1=pwm1+50;
//
// }
// }
// }
//
void PWM_IO(void)
{
if(count==PWM_FRE)
{
count=0;
}
count++;
if (count<pwm1) //判断pwm1是不是改输出高电平
{
PWM1_high;
}
else
{ //不是则输出0
PWM1_low;
}
if (count<pwm2) //判断pwm2是不是改输出高电平
{
PWM2_high;
}
else
{ //不是则输出0
PWM2_low;
}
if (count<pwm3) //判断pwm4是不是改输出高电平
{
PWM3_high;
}
else
{ //不是则输出0
PWM3_low;
}
// if (count<pwm4) //判断pwm4是不是改输出高电平
// {
// PWM4_high;
// }
// else
// { //不是则输出0
// PWM4_low;
// }
}
void main(void)
{
char i,RxBuf;
DDRD|=0x2B;//((1<<0)|(1<<1)|(1<<3)|(1<<5));
DDRD&=~0x14;//(1<<2)|(1<<4);
//******************************************************************************
lcd_init(16);
init_NRF24L01() ;
PWM_int();
#asm("sei")
while(1)
{
SetRX_Mode();
if(nRF24L01_RxPacket(BUF)) //判断是否收到数据
{
display_1(); //---------显示X轴
display_2(); //---------显示Y轴
display_z3(); //---------显示Z轴
delay_us(10); //延时
}
else
{
pwm1=0;
pwm2=0;
}
}
}
// Timer 0 overflow interrupt service routine
interrupt void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xF6;
PWM_IO();
} 代码不全,不知IO是否重复使用,是否有其它中断 全部看看,看看什么情况。
页:
[1]