Технический форум по робототехнике.
lggswep » 26 фев 2012, 18:36
Добрый день.
Я новенький в программировании контролеров. Но мне очень нравиться.
Я столкнулся с проблемой. Не могу считать значения с АЦП.
Изначально задуманная программа была такая: управление мотором(5В) переменным резистором через МК, естественно с помощью ЩИМ. ТО есть: кручу потенциометр в одну строну обороты увеличиваются - в другую уменьшаются.
С ШИМом я заробрался. Вот застрял на АЦП.
Я написал программу для считывания значения с 0-го входа АЦП, и вывод значения на ЖКИ(LM016). Ничего не выводи.
Вот текст:
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
#include <lcd.h>
#include <stdio.h>
#asm
.equ __lcd_port=0x18
#endasm ;
int t;
char *str;
// Read the AD conversion result
unsigned int read_adc(void)
{
ADMUX=00000000;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
while (1)
{
t=read_adc();
sprintf(str,"%",t);
lcd_init(16); //инициализация экрана на 16 символов
lcd_gotoxy(0, 0); //установка курсора в точку (0,0)
lcd_puts(str); //вывод строки
}
}
Пожалуйста, помогите юному инженеру)
boez » 27 фев 2012, 12:40
Учи С
1. Память под строку - где? (не надо сразу бежать за функцией malloc, сделай статический массив символов)
2. В sprintf "%" - это чего за формат такой?
Короче, замени t=read_adc(); на t=77; и добейся появления этих 77 на LCD. А с АЦП у тебя даже возможно все нормально.
lggswep » 27 фев 2012, 16:49
с памятью я понял. Учту.
а формат я не знаю. В инете нашел вот и написал. там еще после % добавляют буквы, а что они означают - не в курсе.
Сейчас буду исправлять. Спасибо.
Romikgy » 27 фев 2012, 18:04
d - целое число....
lggswep » 27 фев 2012, 18:09
Да вот только что дописал. Заработало. Но число изменяется только когда резистор поворачиваешь от половины до максимума, а то 0 до половины число на выходе на изменяется. Наверное переполнено. А как когда сделать что-бы оно по всему диапазону изменялось число.??
boez » 27 фев 2012, 21:36
А вот это уже может быть как в схеме проблема, так и в проге. Померяй тестером реальное напряжение на ноге АЦП в крайних и среднем положении потенциометра - это раз, и еще напиши сюда какие конкретно числа выводятся в крайних и среднем положениях.
lggswep » 27 фев 2012, 22:36
дело в том что я только симулирую. еще нет реальной схемы. Делаю в Протеусе.
теперь значения:
Напряжение на потенциометре. Я потенциометр(1кОм) подключил к 1 вольту.
Напряжение для АЦП выбрал на ножке АРЕФ. там поставил 5 вольт.
теперь когда ползунок на максимуме сопротивление 1кОм напряжение => 0 вольт, на экране число 0.
когда ползунок на минимуме сопротивление 0кОм напряжение => 1 вольт, на экране число 102.Почему 102 видимо связано с настройками АЦП.
Начиная с половины потенциометра 0,5кОм = 0,5 Вольт. число 102, не изменяется.
Что делать?
Еще измерение очень долго проходят. То есть изменение числа при изменении позиции движка потенциометра проходит примерно 4 сек. Как ускорить?