当前位置:   article > 正文

AVR ATtiny13A AD采样控制PWM(AtmelStudio 7)_adc电压采集控制pwm程序

adc电压采集控制pwm程序
  1. /*
  2. * ATtiny13A.c
  3. *通过测量外部的0-3V电压控制PWM输出占空比,频率2KHZ
  4. * Created: 2021/12/9 20:57:11
  5. * Author : JIA
  6. */
  7. #include <avr/io.h>
  8. #define F_CPU 4800000UL //在延时文件前定义
  9. #include <util/delay.h>
  10. //#include <avr/interrupt.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define LED0 PORTB &= ~(1 << PORTB3)
  14. #define LED1 PORTB |= (1 << PORTB3)
  15. void init(void) //初始化函数
  16. {
  17. /******* IO端口配置 ******/
  18. DDRB |= (1 << DDB3) | (1 << DDB0) | (1 << DDB1); //定义输出端口:PB3临时指示灯,PB0-PWM; PB1-STOP(0);
  19. DDRB &= ~((1 << DDB4) | (1 << DDB2)); //定义输入端口:PB4-过载信号监测;PB2-采样信号模拟量输入
  20. PORTB |= (1 << PORTB0); //初始化启动风扇停转
  21. PORTB &= ~((1 << PORTB1) | (1 << PORTB3)); //STOP信号初始化为0;点亮指示灯
  22. /********* ADC 模数转换配置 ***********/
  23. ADMUX |= (1 << MUX0); //VCC作为参考电压,采用右对齐,ADC1(PB2)通道 (REFS0片内1.1V基准)
  24. ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADPS2) | (1 << ADPS0) |(1 <<ADATE); //(ADATE)连续转换,注意这个值,不允许中断,32分频
  25. ADCSRB = 0X00;
  26. /******** 快速PWM配置 ******/
  27. TCCR0A |= (1 << WGM01) | (1 << WGM00) | (1 << COM0A1) | (1 << COM0A0); //快速PWM,PB4引脚,TCNT0与OCR0A匹配时,输出高电平 (后期改为高电平计数置顶输出高电平
  28. TCCR0B |= (1 << CS01); //时钟8分频,2.4KHZ
  29. OCR0A = 0x38; //15%占空比
  30. TCNT0 = 0x00;
  31. }
  32. /****** 转换结果 调整占空比 *******/
  33. void ADC_Convert(void)
  34. {
  35. unsigned long temp = 0 ;
  36. uint adc_v;
  37. temp =ADC;
  38. _delay_ms(2);
  39. temp += ADC;
  40. _delay_ms(2);
  41. temp+=ADC;
  42. temp = temp/3;
  43. adc_v = (unsigned long)temp*5000/1024; //数据处理得到被测电压值
  44. if ( adc_v <= 3000 )
  45. {
  46. if (adc_v <= 300)
  47. {
  48. OCR0A = 0x19; //10% 0x19
  49. }
  50. if ((300< adc_v) && (adc_v <= 600))
  51. {
  52. OCR0A = 0x33; //20%
  53. }
  54. if ((600< adc_v) && (adc_v <= 900))
  55. {
  56. OCR0A = 0x4C; //30%
  57. }
  58. if ((900 < adc_v) && (adc_v <= 1200))
  59. {
  60. OCR0A = 0x66; //40%
  61. }
  62. if ((1200< adc_v) && (adc_v <= 1500))
  63. {
  64. OCR0A = 0x7F; //50%
  65. }
  66. if ((1500< adc_v) && (adc_v <= 1800))
  67. {
  68. OCR0A = 0x99; //60%
  69. }
  70. if ((1800< adc_v) && (adc_v <= 2100))
  71. {
  72. OCR0A = 0xB2; //70%
  73. }
  74. if ((2100< adc_v) && (adc_v <= 2400))
  75. {
  76. OCR0A = 0xCC; //80%
  77. }
  78. if ((2400< adc_v) && (adc_v <= 2700))
  79. {
  80. OCR0A = 0xE5; //90%
  81. }
  82. if ((2700< adc_v) && (adc_v <= 3000))
  83. {
  84. OCR0A = 0xFF; //100%
  85. }
  86. }
  87. else
  88. {
  89. OCR0A =0xFF;// 0xFF;
  90. }
  91. }
  92. /******* 主函数 ********/
  93. int main(void)
  94. {
  95. init(); //初始化
  96. while (1)
  97. {
  98. ADC_Convert();
  99. if ( !((PINB & 0x10)== 0x10))
  100. {
  101. _delay_ms(200); //排除干扰
  102. if ( !((PINB & 0x10)== 0x10))
  103. {
  104. PORTB |= (1 << PORTB1); //控制继电器吸合,启动保护
  105. OCR0A =0xFF; //风扇全速
  106. LED1; //测试指示灯
  107. _delay_ms(8000); //吸何8sec
  108. PORTB &= ~(1 << PORTB1); //继电器断开
  109. LED0;
  110. _delay_ms(1000);
  111. }
  112. }
  113. }
  114. return 0;
  115. }

附:熔丝位配置图

 网上资料比较少,研究调试半天,小冷门,需要的朋友直接用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/381786
推荐阅读
相关标签
  

闽ICP备14008679号