[Atmel] 用AtmelStudio6.2跑mega16例程(47)可调电机速度

[复制链接]
952|0
 楼主| ddllxxrr 发表于 2014-11-5 19:59 | 显示全部楼层 |阅读模式
本例中调节可变电阻,然后AD转换,从而控制PWM宽度,从而控制电机转速。
CCR1A = 0x83 低两位将TCCR1A寄存器波形发生器模式(Waveform Generation mode)选择位WGM1[1:0]设为11,和前两位。
为0011可知T/C1工作模式为10位PWM,相位可调。
TCCR1B = 0x02 低两位同TCCR1A高4位COM1A[1:0]设置T/C1的比较输出模式(Compare Output Modulation:COM).

加1计数与OCR1A比较匹配时将OC1A引脚清零,减1计数写OCR1A比较匹配时将OC1A引脚置1

Proteus运行截图:

Studio6.2运行截图:

程序清单:
  1. /*
  2. * GccApplication10.c
  3. *
  4. * Created: 2014-11-5 19:25:00
  5. *  Author: Administrator
  6. */

  7. #define F_CPU 4000000UL
  8. #include <avr/io.h>
  9. #include <util/delay.h>
  10. #include <stdint.h>

  11. uint16_t ADC_Convert(uint8_t CH)
  12. {
  13.    int Result;
  14.    ADMUX = CH;
  15.    Result = (uint16_t)(ADCL+(ADCH << 8));
  16.    return Result;
  17. }
  18.        

  19. int main(void)
  20. {
  21.     uint16_t x= 0;
  22.         uint16_t PRE_ADC_Result = 0;
  23.         DDRA = 0x00;
  24.         PORTA = 0xFF;
  25.         DDRD = 0xFF;
  26.         PORTD = 0xFF;
  27.         DDRC = 0xFF;
  28.         ADCSRA = 0xE6;
  29.         _delay_ms(3000);
  30.         TCCR1A = 0x83;
  31.         TCCR1B = 0x02;
  32.         while(1)
  33.         {
  34.                 x = ADC_Convert(7);
  35.                 if(x != PRE_ADC_Result)
  36.                 {
  37.                         PRE_ADC_Result = x;
  38.                         if(x==1023) x=0;
  39.                         else if(x==0) x=1023;
  40.                         OCR1A = x;
  41.                 }
  42.         }
  43.        
  44. }
  45.        


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部