Dobrý den,
prosím o radu ohledně AD převodníku v mikrokontroléru ATtiny85. Níže je můj kód a potřeboval bych ho zkontrolovat.
Můj plán byl generovat PWM signál na pinu PB4 podle hodnoty AD převodníku, který je aktivní na pinu PB3. PWM mi funguje, ale AD převodník ne. Je jedno zda připojím PB3 na Vcc nebo GND, výsledek je pořád stejný. Nastavení registrů pro ADC jsem prošel snad stokrát, ale nevidím chybu.
ADC mám nastavený následovně: Jako referenční napětí beru napájecí napětí, ADCH a ADCL zarovnávám vpravo, pin pro ADC je nastaven na PB3, vzorkuji frekvencí FCPU/128, je nastaven Free Running mode.
V hlavní smyčce poté vyčítám registry ADCH a ADCL. Ty ukládám do proměnné, tak že její maximální hodnota je 1023 při Vref=5V a měřenému napětí 5V. Tuto hodnotu poté přepočítám na rozsah pro PWM, tedy 0-255.
Ještě detail, jako měřené testovací napětí beru čistý PWM signál z druhého mikrokontroléru. Napájecí napětí je bráno pro oba mikrokontroléry ze stejného zdroje.
#ifndef F_CPU
#define F_CPU 1000000UL // 1 MHz clock speed
#endif
#include <avr/io.h>
#include <util/delay.h>
unsigned int adc_result_to_PWM_range(unsigned int AdcIn);
int main(void)
{
// PORT B
DDRB = 0b00010000; // SET PB4 as output, rest inputs
// ADC
ADMUX = 0 << REFS1 | 0 << REFS0 | 0 << ADLAR | 0 << REFS2 | 0 << MUX3 | 0 << MUX2 | 1 << MUX1 | 1 << MUX0;
ADCSRA = 1 << ADEN | 1 << ADATE | 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0;
ADCSRB = 1 << BIN | 0 << ADTS2 | 0 << ADTS1 | 0 << ADTS0;
// PWM
OCR1B=250;
TCCR1 = 0b00000001;
GTCCR = 0b01100000;
unsigned int step = 0;
while (1)
{
ADCSRA |= 1 << ADSC;
while(ADCSRA &(1 << ADSC));
step = (8 << ADCH) | ADCL;
OCR1B = adc_result_to_PWM_range(step);
_delay_ms(10);
}
}
unsigned int adc_result_to_PWM_range(unsigned int AdcIn){
return (255 * (AdcIn / 1023));
}
Napadá vás, kde by mohla být chyba? Pokud k tomu potřebujete více informací, tak stačí napsat.
Díky za odpovědi, Kebule.