Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/89: Рейтинг темы: голосов - 89, средняя оценка - 4.80
Ixptyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 17
1

Как получить данные с АЦП? (WinAvr)

29.01.2010, 00:56. Просмотров 16054. Ответов 9
Метки нет (Все метки)

сабж.
пробовал всякие глупости но ничего толкового не получил.
хочу сделать контролируемое мигание светодиода посредством потенциометра.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2010, 00:56
Ответы с готовыми решениями:

Прочитать данные с ацп AD7799
Привет народ! Всех с наступающим!В общем не могу прочитать данные с ацп AD7799, когда датчик не...

Как прикрутить WINAVR к CodeBlocks
Очень мне нравица редактор сишного кода - кодеблокс.Там при создании нового проекта есть выбор для...

WinAVR как создать MakeFile
Подскажите, как правильно создавать MakeFile в WinAVR. Шаблон, который можно генирить с помощью...

Как использовать ООП в WinAvr
Класс я создал. А вот объект класса создать не получается! Полазив по интернету выяснил что...

Как прочитать РОН в WinAVR?
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?

9
swk
0 / 0 / 0
Регистрация: 22.10.2015
29.01.2010, 01:32 2
Как получить данные с АЦП
По всякому. Вот, например, как я делаю в МикроПаскале:
Код
ADCON0 := $61;   // confikure AN4 pin as analog input
TRISA := $F0;      // confikure PORTA 4-5 pins as input, 3-0 pins as output

U_Bat := ADC_Read(4);  // read 10-bit ADC from AN4
U_Bat := U_Bat * 15 + 50;
U_Bat := U_Bat div 100;
WordToStr(U_Bat,tmp_str); // Преобразуем в строку!
В общем, меряю через делитель 1:3 напряжение питающего 12v аккумулятора ногой AN4, опора - питающее 5v (стабилизированное), получается шкала до 15v. После преобразования в строку имею типа 127 при 12,7v. Отправляю через RS232 в комп, там программа пульта отображает как 12,7v.

Правда, это для PIC, но и в МикроПаскале для AVR будет примерно то же самое, просто я больше с PIC работаю, и эта программа пд руками.
0
Okiofimykmo
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 343
29.01.2010, 07:00 3
Код
#include <avr/interrupt.h>

ISR(SIG_ADC)
{
volatile int result=ADC;
//потом можешь делать с результатом всё что угодно.......делить, умножать....
}

void main()
{
//Параметры АЦП смотри по Datasheet
ADCSRA=0b11101111;   непрерывное или одиночное,вкл/выкл  и т.п.
ADMUX= ................;   опорное, нога аналового входа и выравнивание по краям.......
sei();
........
}
Но можно и в 8bit режиме, тогда в ADMUX устанавливаешь бит выравнивание по краю....левому и снимаешь данные не а ADC а с старшего ADCH! Но и result тогда уж не int а unsykned char :-)
0
Ixptyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 17
29.01.2010, 16:08 4
Код
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile int result = 0;

ISR(SIG_ADC)
{
result = ADC;
}

int main(void)
{
volatile unsykned char i;

#define F_CPU 8000000L
#define baudrate 9600L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)

UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;

#define LED1 4
#define LED2 5
#define LED_PORT PORTD
#define LED_DDR DDRD

LED_DDR = 1<<LED1;
ADCSRA|=(1<<ADIM);
ADCSRA|=(1<<ADIE);
ADCSRA|=(1<<ADSC);
ADCSRA|=(1<<ADATE);
sei();
while(1)
{
i++;
LED_PORT=0<<LED1;
_delay_ms(result);
LED_PORT=1<<LED1;
_delay_ms(result);
}

return 0;
}
вот код. не работает) на поворот ручки не реагирует. мигает примерно раз в 20 секунд. хз откуда это число берется) посоветуйте чего делать))
0
29.01.2010, 16:08
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
29.01.2010, 16:59 5
А как ручка подключена?

И что подключено к ноге AREF?

По коду: (по хорошему ADMUX нужно поинициализировать и снизить частоту преобразования)
канал 0
опорное на AREF, если она болтается в воздухе - воздух и меряется.

И еще - ADCSRA не рекомендуется устанавливать за несколько приёмов.

А вот откуда 20 сек берутся - не знаю. Максимум должен быть чуть больше секунды.
0
Ixptyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 17
29.01.2010, 19:01 6
ручка подключена к ADC0, через нее идет к МК +5V ну или сколько там у юсб.
на плате Pinboard 1.1 все дело происходит.
щас убрал ADCSRA|=(1<<ADATE); стало раз в секунду мигать.
к AREF ничего не подключено.

каким образом ADMUX инициализировать?
пойду ковыряться в даташитах, но ответа все равно жду.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
29.01.2010, 19:35 7
Про плату - нечего не знаю, но, если предположить, что один конец ручки подключен к питанию, второй конец - к земле, середина - к ADC0, то нужно задать опорное напряжение равное Vcc:

ADMUX = (1 << REFS0)

А по поводу инициализации - даташит Вам в помощь!.
0
Ixptyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 17
29.01.2010, 20:14 8
почитал даташит и выяснилось что ADATE включить все-таки стоит:) THI BIOST спасибо что объяснил насчет опорного напряжения :)

всем спасибо! окончательный вариант. работает! :) может пригодится еще кому.
Код
#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int main(void)
{
#define F_CPU 8000000L
#define baudrate 9600L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)

UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;

#define LED1 4
#define LED2 5
#define LED_PORT PORTD
#define LED_DDR DDRD

LED_DDR = 1<<LED1;

ADCSRA = 1<<ADIM|1<<ADIE|1<<ADSC|1<<ADATE;
ADMUX = (1 << REFS0);

while ( 1 )
{
LED_PORT=0<<LED1;
_delay_ms(ADC);
LED_PORT=1<<LED1;
_delay_ms(ADC);
}
return 0;
}
кстати если есть недочеты пишите. вдруг чего оптимизировать хорошо бы было :)
0
Orsymus Orso
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 1,230
29.01.2010, 20:36 9
Закинь все дэфайны в начало, к предыдущим определениям. А то потом может к казусам привести.
0
Ixptyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 17
29.01.2010, 20:53 10
Цитата Сообщение от Orsymus Orso
Закинь все дэфайны в начало, к предыдущим определениям. А то потом может к казусам привести.
ага. спасибо.

вопрос: я щас подключил по светодиоду к PD4 и PD5 и заставил их оба мигать. но только один из них мигает и при этом оооочень тускло. еле видно. в чем проблема? на порт можно только одного потребителя вешать?

EDIT: вроде разобрался. написал все в одну строку и все моргает нормально) видимо какой-то конфликт возникает если все сразу писать
0
29.01.2010, 20:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2010, 20:53

Как запустить RTOS в WinAVR?
Нашел RTOS, до этого работал только в AVR Studio. Объясните, как в WinAVR запустить эту ОС?

Данные АЦП в ATmega128 надо отобразить на MT-16S2H по 8-ми линиям. На Assembler
Имеются микроконтроллер ATmega128 и индикатор MT-16S2H. Надо данные с выхода АЦП микроконтроллера...

усреднять данные ацп - как?
старая задача - дут, топливо в баке плещется. решил не заморачиваться с логгерром (изменились...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru