yyyxxw 发表于 2013-5-15 14:38:49

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();


}

lcw_swust 发表于 2013-5-16 18:13:55

代码不全,不知IO是否重复使用,是否有其它中断

xiaoxei 发表于 2013-5-16 22:23:47

全部看看,看看什么情况。
页: [1]
查看完整版本: AVR M8 IO口模拟PWM 为何超过3路波形就不对了