avr单片机 pwm功能

avr单片机在产生pmw的时候,是否占用cpu的资源,而cpu不能处理其他的事情(中断除外)我想用pmw控制电机,电机一转就是10几天,这其中cpu还要进行其它的测量,运算等。所以要知道cpu在产生pmw的时候资源占用的情况,要是占用严重就要加8254之类的芯片了
在产生PWM的时候还要就下波形的脉冲个数,大家说不占用cpu,可是我要的波形频率在387到12600hz之间。当工作在12600hz的时候中断产生的不是很快嘛,当中端很多的时候cpu不是一样被占用吗?????

  AVR单片机TC0快速PWM

  PWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高。改变占空比就改变输出的电压,常用于实现D/A,调节电压或电流,改变电动机的转速等。
  快速PWM模式:它的计数方式是TCNT0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位PWM修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此PWM输出频率高。在快速PWM模式下,计数器的最大值决定了PWM的频率,而比较寄存器OCR0决定了占空比的大小。T/C0是8位计数器, 输出PWM的频率=系统时钟频率/(分频系数*255) 。

  PWM产生过程:定时器启动后,当TNCT0和OCR0的值相等时,输出引脚OC0(PB3)清0,当TNCT0到255时OC0置位,在程序运行过程中改变OCR0中的数值,就改变了OC0输出的占空比。

  //函数功能:控制PB3引脚上的发光二极管由亮到灭,再由灭到亮 (代码来自轻松玩转AVR单片机c语言cd)

  #include

  #define uchar unsigned char

  #define uint unsigned int

  unsigned int count;

  /*********以下是延时函数*********/

  void Delay_ms(uint xms)

  {

  int i,j;

  for(i=0;i

  { for(j=0;j<1140;j++) ; }

  }

  /********以下是端口初始化函数********/

  void port_init()

  {

  DDRB|=(1<

  PORTB&=(0<

  }

  /********定时器0初始化********/

  void timer0_init()

  {

  TCCR0=(1<

  // T/C0工作于快速PWM模式,不分频

  //比较匹配时,OC0置位,记数到0XFF时,清零OC0

  OCR0=0; //比较匹配寄存器初值,

  SREG=0x80; //使能全局中断

  }

  /*********以下是主函数*********/

  void main(void)

  {

  port_init();

  timer0_init();

  while(1)

  {

  for(count=0;count<256;count++) //OCR=0时,LED最亮,然后逐渐变暗

  {

  OCR0=count; //比较匹配寄存器赋值

  Delay_ms(20); //延时一段时间,以观察效果

  }

  Delay_ms(3000); // LED最暗时,延时一段时间

  for(count=255;count>0;count--) //OCR=255时,LED最暗,然后逐渐变亮

  {

  OCR0= count;

  Delay_ms(20);

  }

  Delay_ms(3000); //LED最亮时,延时一段时间

  }

  }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-22
在产生PMW时候可以做其他的事情的,因为pwm是靠定时中断完成的。也就是说,当计数器到达某个时刻,程序跳入中断执行一次。所以在定时器计数的时候CPU可以做其他事情。
第2个回答  2009-11-22
pwm就是靠T/C0或者T/C1的溢出或比较中断对系统时钟进行分频而实现的,不占mcu。
第3个回答  2009-11-23
AVR单片机可以把定时器配置成PWM发生器,只要设置好几个寄存器之后,PWM就开始工作,根本不用CPU干预!所以AVR的PWM是不占用CPU的。

看样子你根本不了解AVR单片机啊,AVR在产生PWM的时候是可以不产生中断的,你被那些使用51单片机模拟产生PWM的给误导了。
第4个回答  2009-11-22
PWM不占用CPU,AVR可以同时做别的事
相似回答