Tak mně to nedalo, začal jsem testovat a hlavní problém byl použití měřeného napětí z výstupu PWM druhého mikrokontroléru. Je určitě potřeba filtr a odfiltrovat střídavou složku a dostat z PWM opravdu pouze střední hodnotu napětí (ne tu efektivní, jak jsem psal výše).
Teď když na ADC nastavím určité napětí, dostanu přesně to stejné na výstupu PWM. Je to otestováno na verzi níže a i na verzi, kdy se čte hodnota z ADC při přerušení.
#ifndef F_CPU
#define F_CPU 1000000UL // 1 MHz clock speed
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned long adc_result_to_PWM_range(unsigned long AdcIn);
int main(void)
{
// PORT B
DDRB |= 1 << DDB4; // SET PB4 as output, rest inputs
// PWM
OCR1B = 250;
TCCR1 = 0b00000001;
GTCCR = 0b01100000;
// ADC
ADMUX = (1 << MUX1);
ADMUX |= (1 << MUX0);
ADCSRA = (1 << ADEN);
ADCSRA |= (1 << ADATE);
ADCSRA |= (1 << ADPS2);
ADCSRA |= (1 << ADPS1);
ADCSRA |= (1 << ADSC);
while (1)
{
while ( !(ADCSRA & (1 << ADIF)));
OCR1B = adc_result_to_PWM_range(ADC);
_delay_ms(10);
ADCSRA |= (1 << ADIF);
}
}
unsigned long adc_result_to_PWM_range(unsigned long AdcIn){
return ((AdcIn * 1000 * 255) / 1023) / 1000;
}
Děkuji chlapi za rady a zároveň narovinu přiznávám, že se ještě ozvu.