osc » 05 мар 2010, 21:06
UART настроен правильно, проверял, работает.
Так как выше написано не работает, undefined symbol 'ADSC'!
АЦП настроен мастером Cvavr:
- Код: Выделить всё • Развернуть
DIDR0=0x3E;
ADMUX=0xC0 & 0xff;
ADCSRA=0x8E;
P.S Протеусом пользоваться умею, читать эту "кашу" как то неохото...
Добавлено спустя 1 час 8 минут 32 секунды:Разобрался, когда источник опорного напряжение поменял с внутреннего на AVCC, и все ок

osc » 07 мар 2010, 22:14
С одним каналом АЦп работать научился, включать и выключать каналы тоже, но есть вопрос, если я оцифровываю напряжение с 2-х каналов АЦП, результат оцифровки по-прежнему записывается в ADCW?
avr123.nm.ru » 07 мар 2010, 22:37
osc писал(а):P.S Протеусом пользоваться умею,
Ну и ...
mikolka6 » 11 мар 2010, 15:42
Доброва времени суток. У меня проблема . Я делаю модинг игровой приставки XBOX 360 под робота с мультика ВАЛЛИ с гусеницами, головой, руками . По задумке гусеницы будут не задействованы, просто при включении приставка будет приподниматься над поверхностью как Танк эта функция уже сделана. Голова с редукторами, вращение в право ,лево , на 180 градусов , также подъём и наклон головы, редуктора есть для этого с обычными моторами , еще функция подъема и опускания руки. Хотелось бы, чтоб голова без определенных интервалах времени(хаотично) смотрела то в верх то вниз , вправо лево , то совместно право в верх или на руку а рука при этом поднялась , в общем жил своей жизнью . Вопрос так как я в МК полный нуб , может кто видел схемку с прошивкой подобие моего варианта, МК мне пошьют а схему сам соберу. Посоветуйте ,что ни будь.
CoSS » 15 мар 2010, 00:43
oscесли я оцифровываю напряжение с 2-х каналов АЦП, результат оцифровки по-прежнему записывается в ADCW?
Если речь не о Xmega - куда-ж ему еще бедному деться.
osc » 15 мар 2010, 17:58
Да я уже разобрался.
Вопрос по АЦП меги16, настроил все правильно, оцифровываю и отправляю в UART, приходят странные значения, настройки:
- Код: Выделить всё • Развернуть
ADMUX=0b01100000;
ADCSRA=0b10001110;
//код в прерывании:
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
adc_data=ADCH;
result = ((adc_data*1024)/2.56)*3; //умножаю на 3 т.к. на входе стоит делитель напряжения.
putchar((int)result);
}
Напряжение на входе делителя 5 в. Опорное напряжение 2.56, напряжение на входе АЦП 1.7 в. 1.7*3 = 5.1 все правильно, но в UART приходит 32

Конденсатор на AREF есть. Подобным образом измерял напряжение при помощи atmega88, все работало, а мега 16 не хочет, в чем моя ошибка?
blindman » 15 мар 2010, 18:07
А что ты ожидаешь получить в уарте при напряжении 1.7 вольт?
osc » 15 мар 2010, 18:13
5 т.к. (adc_data*1024)/2.56 = 1.7 , потом умножаю на 3 и получаю 5.
blindman » 15 мар 2010, 18:19
Даже если в adc_data будет 1, то 1 * 1024 / 2.56 = 400. Откуда возьмется 1.7 когда adc_data = 680?
osc писал(а):в чем моя ошибка?
Похоже, арифметику подзабыл
osc » 15 мар 2010, 20:59
Похоже
Напряжение считается по формуле U = (ADCH*2.56)/1024
Если adch = 680, то U должно быть минимум 1, приходит 0, в чем же дело?
rig » 15 мар 2010, 21:18
unsigned int adc_data;
unsigned int 16 0 to 65535
все операции с целыми числами, откуда деление на дробь!!
как оно ваще у вас работает??
и в порт сначала надо получить значение с adc_data, а уже потом, когда значение будет правильным, начинать извращаться над ним.
osc » 15 мар 2010, 21:20
Сорри, описка, все в double
- Код: Выделить всё • Развернуть
interrupt [ADC_INT] void adc_isr(void)
{
double adc_data;
adc_data=((ADCH*2.56)/1024);
putchar((char)adc_data);
}
Приходит 55, а должно 1. Ради интереса посмотрел как я раньше считывал результат с АЦП меги88, все также, разве что регистры немного другие.Дошло, в ADMUX не то число записал

rig » 15 мар 2010, 22:06
незнаю на сколько правильно, я чтоб уйти от дробей делал так.
- Код: Выделить всё • Развернуть
Power_bat=(unsigned int) (((unsigned long int)adc_data[1])* 4590/10000) ; // расчет питания на батарее
данные АЦП умножал на некий коэф. и на выходе получал сразу напряжение с учетом делителя.
- Код: Выделить всё • Развернуть
к примеру на делителе имеем 1,7В
делитель запитан от 5В
опорное 2,56
АЦП расчетно должен выдать 680.
5В/680=0,0073529411764705882352941176470588, округлим =0,00735
теперь в зависимости от точности можно считать так:
- Код: Выделить всё • Развернуть
680*7=4760 /100=47
680*73=49640 /1000=49
680*735=499800 /10000=49
тоесть в дальнейшем моё число вписывалось в один байт.
Деля, где надо, на: 10 и %10 получал целую и дробную часть.
osc » 15 мар 2010, 22:20
Попробовал по этой методике и по формуле из даташита, результат даже близко не лежит
