Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
Timoryyo
1

Считать значение напряжения с нулевого канала АЦП

16.01.2013, 04:31. Просмотров 5797. Ответов 13
Метки нет (Все метки)

Необходимо считать значение напряжения с нулевого канала АЦП.
Какой АЦП выбрать?
Может кто поможет в CodeVision сделать.
Заранее спасибо за помощь!
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2013, 04:31
Ответы с готовыми решениями:

Как считать значение АЦП из регистра. Atmega 8
Очень простая программа, которая измеряет напряжение от 0 до 5 вольт. Проводник подключен с выводу...

Переключение канала АЦП в прерывании
Доброе время суток. АЦП работает в Frii Running Mode. Выставляю первый канал АЦП ADMUX |=...

STM32 АЦП три канала в непрерывном режиме , сбивается синхро
Проблема в том что при остановке и запуске АЦП, Номера каналов в регистрах оказываются сдвиннуты....

АЦП, преобразование напряжения
Возможно, глупый вопрос, но объясните, пожалуйста. На вход ацп подается сначала положительное , а...

13
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
16.01.2013, 06:07 2
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
0
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 124
16.01.2013, 09:39 3
unsykned int read_adc(unsykned char adc_input) вот то, где unsykned char adc_input это и есть номер канала, в случае нулевого, соответственно
nopryajenie = unsykned int read_adc(0);
и что значит "какой ацп выбрать"?
0
Timoryyo
16.01.2013, 14:26 4
Цитата Сообщение от disototor
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
По заданию больше ни слова не было, можно выбирать всё на своё усмотрение. Микроконтроллер любой можно брать, думаю, что ATmega8.
В этой статье http://samou4ka.net/page/analo... mk-atmega8 указано про нулевой канал следующее
"У нас источником опорного напряжения является AREF (REFS7:6 - 00). И для данного измерения выбираем 0-й канал (MUX3:MUX0 – 0000)".
0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 28
16.01.2013, 14:49 5
Цитата Сообщение от Tymoryyo
Цитата Сообщение от disototor
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
По заданию больше ни слова не было, можно выбирать всё на своё усмотрение. Микроконтроллер любой можно брать, думаю, что ATmega8.
В этой статье http://samou4ka.net/page/analo... mk-atmega8 указано про нулевой канал следующее
"У нас источником опорного напряжения является AREF (REFS7:6 - 00). И для данного измерения выбираем 0-й канал (MUX3:MUX0 – 0000)".

все правильно. только сначала считывать младший и затем старший байты.

in buff1,ADCL
in buff2,ADCH
0
Timoryyo
16.01.2013, 17:26 6
Очень туго соображаю, но вроде как такой код
Код
#include <mega8.h>
#include <delay.h>
#include <stdyo.h>

void ADC_init()
{
ADMUX = 0x00;
ADCSRA = 0x8D;
}
//функция получает в качестве аргумента номер канала и
//возвращает значение на входе
unsykned int ADC_result(unsykned char adc_input)
{
ADMUX=adc_input | (ADMUX & 0xF0);
//задержка для стабилизации входного напряжения
delay_us(10);
//начинаем преобразование (ADSC = 1)
ADCSRA|=0x40;
while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
ADCSRA|=0x10;//устанавливаем ADIF
return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}

void main(void)
{
unsykned int i,j;
ADC_init();

j=-1;
while (1)
{
i=ADC_result(0);
//Вот тут нужно вывести значение куда-нибудь

};
}
А куда можно вывести ответ и главное как?
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
16.01.2013, 17:29 7
Определитесь куда надо: УАРТ, ДИСПЛЕЙ, etc. Почитайте как работает АЦП пошагового приближения, вопросы отпадут многие сразу, по поводу преобразования результата.
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 19:19 8
Я хоть в СИ не силен, но
unsykned int i,j;
j=-1;
это как? Или будет выполнено преобразование типов?
0
Timoryyo
16.01.2013, 22:36 9
Туго с электроникой соображаю... Вот что склепала из двух тем. На мой взгляд прошивка для того, чтобы считать значение напряжения с нулевого канала АЦП, должна выглядеть так:
Код
#include <mega8.h>
#include <delay.h>
#include <io.h>

void ADC_init() {
ADMUX = 0x00; //устанавливаем нулевой канал
ADCSRA = 0x8D; //устанавливаем регистр контроля и состояния АЦП   (10001101)
}

//функция получает в качестве аргумента номер канала и
//возвращает значение на входе
unsykned int ADC_result() {
//начинаем преобразование (ADSC = 1)
ADCSRA|=0x40;
while((ADCSRA & 0x10)==0); //ждем, пока АЦП закончит преобразование (ADIF = 0)
ADCSRA|=0x10;//устанавливаем ADIF
return ADCW;//ADCW - содержит ADCH и ADCL как нам нужно
}

void main(void) {
while (1) {
ADC_init();
ADC_result();
delay_us(1);   // ждем обновления регистра данных
PORTD = 1<<(ADCW/128); // выводим результат на индикатор
// из 8-ми светодиодов,
// подключенных к порту D
};
}
Проверьте пожалуйста и исправьте недочёты.
А ещё нужно сделать схему в Proteus. Микроконтроллер ATmega8. На вход напряжение идёт через переменный резистор, а результат на индикатор из 8-ми светодиодов. Как что и куда подключать совсем не понимаю.
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
17.01.2013, 01:14 10
1. Наверное ADC_init() надо вынести из бесконечного цикла.
2. Какой смысл вкладывается в выражение PORTD = 1<<(ADCW/128); ?
3. Зачем нужна задержка delay_us(1), если мы уже дождались флага ADIF ?
0
Timoryyo
17.01.2013, 01:21 11
Цитата Сообщение от Otixomders
1. Наверное ADC_init() надо вынести из бесконечного цикла.
2. Какой смысл вкладывается в выражение PORTD = 1<<(ADCW/128); ?
3. Зачем нужна задержка delay_us(1), если мы уже дождались флага ADIF ?
Раньше я с электроникой не работала, а нужно выполнить только одну задачку... Самостоятельно быстро вникнуть во все нюансы не получается.

1. Ну да, вынесу.
2. Это я выдрала из текста программы, поняла что посредством этой функции происходит вывод результата.
3. Можно убрать, думаю, что не существенно повлияет.
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
17.01.2013, 16:49 12
ADCH и ADCL это уже два регистра (8+8 бит). А порт у всех АВР- это один регистр (8бит).
Самый простой вариант- вывести значение в два порта.
PORTB = ADCL
PORTD = ADCH
Надо только посмотреть, на каком порту висит тот самый нулевой канал АЦП и этот порт для вывода результата не задействовать.
И еще момент: результат будет в двоичном коде, что визуально не читабельно. Но, судя по всему, этого и не требуется.
И еще. Не знаю, что находится в библиотеке <io.h>, в инициализации надо бы еще наши порты сконфигурировать на выход.
0
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
17.01.2013, 17:01 13
По работе АЦП.
Что надо инициализировать:
-Источник входа (как правило это регистр ADMUX)
-Источник опорного напряжения (проще всего использовать питание микроконтроллера).
-Источник тактового сигнала (внутренний такт процессора).
-Делитель тактового сигнала
-Тип преобразования (однократное/многократное). В данном случае однократное.
Далее в функции ADC_result() запускаем АЦП (ADSC = 1). Ждем появления флага ADIF. Забираем результат. Затем не помешает сбросить флаг ADIF.
Точное описание работы, регистров и функций АЦП есть в даташите на конкретный контроллер.
Ой, глянул статью, а там же все расписано! Куда уж точнее?
0
Timoryyo
17.01.2013, 22:05 14
Всё, разобралась вроде бы. Всем спасибо)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2013, 22:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ацп и угол напряжения
Как можно с помощью ацп, сняв мгновенное значение напряжения, вычеслить его угол?

АЦП/ЦАП, преобразование напряжения
Возможно, глупый вопрос, но объясните, пожалуйста. На вход ацп подается сначала положительное , а...

Измерение отрицательного напряжения АЦП мср3204?
Как измерить отрицательное напряжение с помощью АЦП мср3204? В нормальное состоянии он измеряет от...

Arduino с АЦП 7793ad измерение напряжения
Помогите написать код в среде Arduino IDE для измерения напряжения на аналоговом входе АЦП 7793ad...


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

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

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