Easyelectronics.ru

Электроника для всех
Текущее время: 20 янв 2021, 22:08

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 01:43 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 17
сабж.
пробовал всякие глупости но ничего толкового не получил.
хочу сделать контролируемое мигание светодиода посредством потенциометра.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 02:19 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Цитата:
Как получить данные с АЦП

По всякому. Вот, например, как я делаю в МикроПаскале:
Код:
ADCON0 := $61;   // configure AN4 pin as analog input
TRISA := $F0;      // configure 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 работаю, и эта программа пд руками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 07:47 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 02:07
Сообщения: 391
Откуда: Воронеж
Код:
#include <avr/interrupt.h>

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

void main()
{
//Параметры АЦП смотри по Datasheet 
ADCSRA=0b11101111;   непрерывное или одиночное,вкл/выкл  и т.п.
ADMUX= ................;   опорное, нога аналового входа и выравнивание по краям.......
sei();
........
}


Но можно и в 8bit режиме, тогда в ADMUX устанавливаешь бит выравнивание по краю....левому и снимаешь данные не а ADC а с старшего ADCH! Но и result тогда уж не int а unsigned char :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 16:55 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 17
Код:
#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 unsigned 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<<ADEN);
   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 секунд. хз откуда это число берется) посоветуйте чего делать))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 17:46 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
А как ручка подключена?

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

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

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

А вот откуда 20 сек берутся - не знаю. Максимум должен быть чуть больше секунды.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 19:48 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 17
ручка подключена к ADC0, через нее идет к МК +5V ну или сколько там у юсб.
на плате Pinboard 1.1 все дело происходит.
щас убрал ADCSRA|=(1<<ADATE); стало раз в секунду мигать.
к AREF ничего не подключено.

каким образом ADMUX инициализировать?
пойду ковыряться в даташитах, но ответа все равно жду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 20:22 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
Про плату - нечего не знаю, но, если предположить, что один конец ручки подключен к питанию, второй конец - к земле, середина - к ADC0, то нужно задать опорное напряжение равное Vcc:

ADMUX = (1 << REFS0)

А по поводу инициализации - даташит Вам в помощь!.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 21:01 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 17
почитал даташит и выяснилось что ADATE включить все-таки стоит:) THE BEAST спасибо что объяснил насчет опорного напряжения :)

всем спасибо! окончательный вариант. работает! :) может пригодится еще кому.
Код:
#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<<ADEN|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;
}


кстати если есть недочеты пишите. вдруг чего оптимизировать хорошо бы было :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 21:23 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:17
Сообщения: 2235
Откуда: Krasnoyarsk
Закинь все дэфайны в начало, к предыдущим определениям. А то потом может к казусам привести.

_________________
У кошки четыре ноги: вход (in), выход (out), земля (gnd) и питание (vcc). А хвост для беспроводной передачи данных.
http://www.orcinus.ru (null)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как получить данные с АЦП? (WinAvr)
СообщениеДобавлено: 30 янв 2010, 21:40 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 17
Orcinus Orca писал(а):
Закинь все дэфайны в начало, к предыдущим определениям. А то потом может к казусам привести.

ага. спасибо.

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

EDIT: вроде разобрался. написал все в одну строку и все моргает нормально) видимо какой-то конфликт возникает если все сразу писать


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB