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

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

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

Необходимо считать значение напряжения с нулевого канала АЦП.
Какой АЦП выбрать?
Может кто поможет в CodeVision сделать.
Заранее спасибо за помощь!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 04:31
Ответы с готовыми решениями:

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

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

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

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

Atmega 1281 АЦП показывает наличие напряжения при 0В
Atmega 1281. Встроеные подтягивающие резисторы подключены. Их использование...

13
disototor
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
16.01.2013, 06:07 2
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
0
sirki962
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
0 / 0 / 0
Регистрация: 12.01.2013
Сообщений: 6
16.01.2013, 14:26 4
Цитата Сообщение от disototor
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
По заданию больше ни слова не было, можно выбирать всё на своё усмотрение. Микроконтроллер любой можно брать, думаю, что ATmega8.
В этой статье http://samou4ka.net/page/analogo-cifrovoj-preobrazovatel-mk-atmega8 указано про нулевой канал следующее
"У нас источником опорного напряжения является AREF (REFS7:6 - 00). И для данного измерения выбираем 0-й канал (MUX3:MUX0 – 0000)".
0
pops0417
0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 28
16.01.2013, 14:49 5
Цитата Сообщение от Tymoryyo
Цитата Сообщение от disototor
Нулевой канал всмысле 0 на мультиплексоре? Если да, то было бы крайне отлично указать хоть какой камешек использовать хотите (микроконтроллер).
По заданию больше ни слова не было, можно выбирать всё на своё усмотрение. Микроконтроллер любой можно брать, думаю, что ATmega8.
В этой статье http://samou4ka.net/page/analogo-cifrovoj-preobrazovatel-mk-atmega8 указано про нулевой канал следующее
"У нас источником опорного напряжения является AREF (REFS7:6 - 00). И для данного измерения выбираем 0-й канал (MUX3:MUX0 – 0000)".

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

in buff1,ADCL
in buff2,ADCH
0
Timoryyo
0 / 0 / 0
Регистрация: 12.01.2013
Сообщений: 6
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
disototor
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 523
16.01.2013, 17:29 7
Определитесь куда надо: УАРТ, ДИСПЛЕЙ, etc. Почитайте как работает АЦП пошагового приближения, вопросы отпадут многие сразу, по поводу преобразования результата.
0
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
16.01.2013, 19:19 8
Я хоть в СИ не силен, но
unsykned int i,j;
j=-1;
это как? Или будет выполнено преобразование типов?
0
Timoryyo
0 / 0 / 0
Регистрация: 12.01.2013
Сообщений: 6
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
Otixomdirs
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
0 / 0 / 0
Регистрация: 12.01.2013
Сообщений: 6
17.01.2013, 01:21 11
Цитата Сообщение от Otixomders
1. Наверное ADC_init() надо вынести из бесконечного цикла.
2. Какой смысл вкладывается в выражение PORTD = 1<<(ADCW/128); ?
3. Зачем нужна задержка delay_us(1), если мы уже дождались флага ADIF ?
Раньше я с электроникой не работала, а нужно выполнить только одну задачку... Самостоятельно быстро вникнуть во все нюансы не получается.

1. Ну да, вынесу.
2. Это я выдрала из текста программы, поняла что посредством этой функции происходит вывод результата.
3. Можно убрать, думаю, что не существенно повлияет.
0
Otixomdirs
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
Otixomdirs
0 / 0 / 0
Регистрация: 13.10.2010
Сообщений: 71
17.01.2013, 17:01 13
По работе АЦП.
Что надо инициализировать:
-Источник входа (как правило это регистр ADMUX)
-Источник опорного напряжения (проще всего использовать питание микроконтроллера).
-Источник тактового сигнала (внутренний такт процессора).
-Делитель тактового сигнала
-Тип преобразования (однократное/многократное). В данном случае однократное.
Далее в функции ADC_result() запускаем АЦП (ADSC = 1). Ждем появления флага ADIF. Забираем результат. Затем не помешает сбросить флаг ADIF.
Точное описание работы, регистров и функций АЦП есть в даташите на конкретный контроллер.
Ой, глянул статью, а там же все расписано! Куда уж точнее?
0
Timoryyo
0 / 0 / 0
Регистрация: 12.01.2013
Сообщений: 6
17.01.2013, 22:05 14
Всё, разобралась вроде бы. Всем спасибо)
0
17.01.2013, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 22:05

нулевое значение АЦП
Столкнулся с проблемой. в диф.режиме ацп если не подавать напряжение на...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для...

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если...


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

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

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