/* ADtmr0pwm.c AD0 controls LED on PD6 or PD6 connected to inbuilt LED at PB5 */ // this code sets up counter0 for an 8kHz Fast PWM wave @ 16Mhz Clock // Arduino UNO R3 // AVR_ATmega328P #define F_CPU 16000000UL #include #include void init_AD( void ); int main(void) { unsigned char num; DDRD |= (1 << DDD6); // PD6 (PWM pin OC0A) is now an output DDRB &= ~( 1 << PB5 ); // LED pin as input could be connected to output PD6 OCR0A = 128; // set PWM pin OC0A for 50% duty cycle at start // Bits in TCCR0A register: "COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00" TCCR0A |= (1 << COM0A1); // set none-inverting mode "1 0" TCCR0A |= (1 << WGM01) | (1 << WGM00); // set fast PWM Mode "------11" // Bits in TCCR0B register: "FOC0A FOC0B - - WGM02 CS02 CS01 CS00" TCCR0B |= (1 << CS01); // set prescaler to 8 and starts PWM "-----010" init_AD(); while (1) { ADCSRA |= (1 << ADSC); // Start AD while( ADCSRA & (1 << ADSC) ) {} // Wait for AD done num = ADCH; // result 8 bit left adjusted OCR0A = num; // we have a working Fast PWM _delay_ms(100); } } /* *********************************** */ /* FUNCTIONS */ /* *********************************** */ void init_AD( void ) { // Bits in ADCSRA register: "ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0" // F_ADC = F_CPU/PRESCALE sample rate (50kHz < F_ADC < 200kHz) // 16MHz/128 = 125KHz so we set ADC prescaler to 128 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // "-----111" ADCSRA |= (1 << ADEN); // "1-------" Enable AD converter // Bits in ADMUX register: "REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0" // Select AD0 "----0000" is default, nothing has to be done ADMUX |= (1 << REFS0); // "01------" Set reference voltage to AVCC ADMUX |= (1 << ADLAR); // "--1-----" Set 8 bit Left adjust // Turn off digital buffer at the AD pin DIDR0 |= (1 << ADC0D); // In main program to start AD // ADCSRA |= (1 << ADSC); // In main program to wait for AD done // while(ADCSRA & (1<RXD A5|- | \/ | -|D01 -|D13 LED --- | -(D08)-|14 PB0 PWM/PB1 15|-(D09)- -|GND | |______________________________| -|AREF | -|SCL | -|SDA | |________________| */