#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
void ADC_init(void);
void Tim_init(void);
unsigned int ADC_read(unsigned char);
int main(void)
{
Tim_init(); // Initialization of Timer1
DDRB |= 0b00000111;// Set PB1 and PB2 as outputs
TCCR1A |= (1<<COM1A1); // PWM on port B1 - non-inverted compare mode 2
TCCR1A |= (1<<COM1B1); // PWM on port B2 - non-inverted compare mode 2
TCNT1 = 0;
OCR1A = 1500;
OCR1B = 1500;
TIMSK1 |= (1<<OCIE1A);
TIMSK1 |= (1<<OCIE1B);
ADC_init(); // Initialization of ADC
while (1)
{
if (TIFR1 & (1 << OCF1A))
{
OCR1A = ADC_read(0);
}
if (TIFR1 & (1 << OCF1B))
{
OCR1B = ADC_read(1);
}
}
}
void Tim_init(void)
{
TCCR1A = 0; // disable all PWM on Timer1
ICR1 = 19999; // frequency 20ms
TCCR1A = (1<<WGM11); // Timer 1 for Fast PWM mode via ICR1, with no prescaling
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1 << CS10) ;
}
void ADC_init(void) // Initialization of ADC
{
ADMUX=(1<<REFS0); // AVcc with external capacitor AREF
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0); // Enable ADC and set Prescaler division factor as 128
}
unsigned int ADC_read(unsigned char ch)
{
ch= ch & 0b00000011; // Set chanel 1 or 2
ADMUX |= ch; // selecting channel
ADCSRA|=(1<<ADSC); // start conversion
while(!(ADCSRA & (1<<ADIF))); // waiting for ADIF, conversion complete
ADCSRA|=(1<<ADIF); // clearing of ADIF
return ((ADCL|(ADCH<<8))*8);
}