ну конечно же я мерял мультиметром напряжение на ножке AREF. 5вольт!
по поводу того что было опорное с конденсатором, это было в начале, я уже поменял на просто со входа. Я уже что только не пробовал, по этому могут быть такие путаницы.
За неточные выражения прошу прощения, я сам считаю себя педантичным человеком и предпочитаю выражатся четко и используя правильные термины, просто уже сил нету мучать Атмегу ну и пошел в ход чтото типа сленга.
вот светодиод загорается на 100 ШИМ при 4х вольтах на входе ADC0 когда я даю напряжение с потенциометра. дальше когда докручиваю потенциометр после 4х вольт шим сбрасуется на 0 и идет опять по нарастающей примерно до 3ти заполнения на 5ти вольтах. переполнения типа происходит.
и вот так я пробовал тестить :
Код: Выделить всё
if(ReadADC(0)>1023)
OCR1A = 255;
else
OCR1A = 0;
на OCR1A вешал светодиод и он загорается при 4х вольтах (потенциометр недокручен до конца)
Добавлено after 2 hours 14 minutes 44 seconds:
всем огромное спасибо, я разобрался в своих проблемах.
Проблема с АЦП решилась, сотый раз перечитывая код я нашел ошибку. Вот в функции вычисления АЦП:
Код: Выделить всё
unsigned int ReadADC(unsigned int ch) // принимает на вход вариант номера пина
{
unsigned char setADMUX = ADMUX;
setADMUX &= ~((1 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0)); // ADC0 про дефоулту
switch(ch)
{
case 1: setADMUX |= (0 << MUX3)|(0 << MUX2)|(0 << MUX1)|(1 << MUX0); break; // PС1 ADC1 номер пина адц
case 2: setADMUX |= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0); break; // PС2 ADC2 номер пина адц
case 3: setADMUX |= (0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(1 << MUX0); break; // PС3 ADC3 номер пина адц
case 4: setADMUX |= (0 << MUX3)|(1 << MUX2)|(0 << MUX1)|(0 << MUX0); break; // PС4 ADC4 номер пина адц
case 5: setADMUX |= (0 << MUX3)|(1 << MUX2)|(0 << MUX1)|(1 << MUX0); break; // PС5 ADC5 номер пина адц
default: break;
}
ADMUX = setADMUX;
_delay_us(10);
int tmp = 0;
for(int i = 0; i<40; i++) // усредняем скачки напряжения
{
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA &(1 << ADSC))== 0); // Ждем флага окончания преобразования
tmp += ADC; // Считываем ADC
}
return tmp/40;
}
проблема в переполнении типа int в переменной tmp.
дело в том что в цыкле 40 раз я сумирую результат, и если значение АЦП близится к 1000 (5 вольт) то 1000*40 мы получаем 40000, но тип инт 32тыс с хвостиком, и соответственно у нас при переполненни типа получается.
изменил количество итераций на 20, теперь все в порядке. Можно было бы и сделать тип другой у tmp например unsigned int.
также и решилась вторая проблема с зависимостью значений в регистрах OCR1A и OCR1B. сделал вот так
Код: Выделить всё
//// Настройка Таймера1 для PWM ////
TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // не инвертированый PWM
| (1 << COM1B1)|(1 << COM1B0) // инвертированый PWM
| (0 << WGM11)|(1 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это
TCCR1B |= (0 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1
|(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя
[code]
и в мейни в цыкле дергаю ацп и заношу значения в регистры сравнения
[code]
OCR1A = ReadADC(0)/4;
OCR1B = ReadADC(1)/4;
все клево, все работает.