Monday, June 8, 2020

Using ADC of ATMega32 to adjust PWM duty cycle

In this module we have discuss about using ADC with some typical applications. Using a POT we can adjust the analog value fed to the ADC input pin manually and linearly. With this advantage we can use the ADC value to adjust the duty cycle of PWM signal.

In this example, I use ADC to vary the PWM duty cycle between 0 to 100%. The ADC value is scaled from 1024 to 100 to fit the PWM timing. PWM signal is created by timer 0 interrupt. Each interrupt occurs for every 10 micro seconds.

Using ADC of ATMega32 to adjust PWM duty cycle

Schematic diagram

Source code:

  1. #include <avr/io.h>
  2. #include "avr/interrupt.h"
  3. unsigned char cnt=0;
  4. void speedControl(unsigned int speed){
  5. float _dutyCycle;
  6. unsigned int dutyCycle;
  7. _dutyCycle=speed*(100.0/1024);
  8. //dutyCycle=20;
  9. dutyCycle=10+(int)_dutyCycle;
  10. if(cnt<dutyCycle) PORTD|=(1<<0);
  11. if(cnt>=dutyCycle) PORTD&=~(1<<0);
  12. if(cnt>=100) cnt=0;
  13. }
  14. int main(void)
  15. { unsigned int adcResult;
  16. //PortD as output
  17. DDRD=0xFF;
  18. //PA0 or ADC0 as an analog input
  19. DDRA=0;
  20. //Set 1:8 pre-scaler
  21. TCCR0=0x02;
  22. //Clear overflow flag
  23. TIFR=0x01;
  24. //Enable Timer 0 interrupt
  25. TIMSK=0x01;
  26. //set global interrupt
  27. sei();
  28. //Turn on the ADC module
  29. ADCSRA|=(1<<ADEN);
  30. /*Select ADC7*/
  31. ADMUX|=0x07;
  32. while (1)
  33. {
  34. //Start the conversion
  35. ADCSRA|=(1<<ADSC);
  36. //Wait for the completion
  37. while((ADCSRA&(1<<ADSC))==1); //Read the result
  38. adcResult=ADCL+(ADCH<<8);
  39. speedControl(adcResult);
  40. }
  41. }
  42. ISR(TIMER0_OVF_vect){
  43. //Load -5 to make 10 uS interrupt time
  44. TCNT0=-5;
  45. cnt+=1;
  46. TIFR=0x01;
  47. }
  48.  


Click here to download its source file. Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.

No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)