Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Другие темы раздела
ARM, Cortex, STM32 L151K4 зависает в LPR https://www.cyberforum.ru/arm/thread2089009.html
MK L151K4 хотел попробовать включить LPR режим как в примере http://we.iosyitistromyss.ru/STM8/low-power-run-esche-odin-rezhim-energosberezheniya.html пример проверил на STM8L Dyscovery, все...
ARM, Cortex, STM32 STM8L052 option bytes
Добрый день! надо разобраться с Option bytes в STM8L052R8. Не могу найти мануал в котором описаны эти регистры, в частности интересуют заводские значения. А также может кто подскажет, с завода...
STM8L152 RTC и спящий режим. ARM, Cortex, STM32
День добрый, хотел бы использовать STM8L152 в режиме минимально возможного потребляемого тока с включенным RTC. В даташите говорится что лучшее что возможно это Active-halt wyth full RTC...
ARM, Cortex, STM32 Вопросы по LSI и потреблению Не получается снизить энергопотребление. Переключился на LSI (включил соответствующий option byte), потребление упало с 9,5 mA до 8,5 mA, что всё равно очень много Вот код //отключение... https://www.cyberforum.ru/arm/thread2089006.html
ARM, Cortex, STM32 STM8 IAR... нюансы https://www.cyberforum.ru/arm/thread2089005.html
Написал свой криптозагрузчик... сделал все красиво, с индикацией на дисплее режима ожидания, индикацией процесса загрузки, для этого использовал несколько прерываний... НО в конце с удивлением...
ARM, Cortex, STM32 \st_toolset\stvd\stvdebug.exe не запускается (решено)
что делать ? win xp <Изображение удалено>
ST TOOLSET STVD portable ? ARM, Cortex, STM32
V4.3.10 Проверяйте. https://vk.com/doc70462960_441719987
ARM, Cortex, STM32 2016г.Обзор,сравнение и тесты 4 компиляторов для STM8 (engl) Cosmic SDCC Raisonance IAR http://colecovision.eu/stm8/sompyters.shtml Было бы здорово если кто-то переведёт лучше чем машинный перевод,включая графику Машинный перевод:... https://www.cyberforum.ru/arm/thread2089002.html
ARM, Cortex, STM32 STM8 в работе... https://www.cyberforum.ru/arm/thread2089001.html
По ходу юзания, появляются вопросы, которые вроде уже не вписываются в тему "STM8 Самое начало", тем более oxytt тут посоветовал с новой веткой... в общем буду сюда сыпать вопросы более глубокие чем...
ARM, Cortex, STM32 где взять Raisonance не кашляющий ? можно и IDE rid7 где взять Raisonance не кашляющий ? можно и IDE rid7 https://www.cyberforum.ru/arm/thread2089000.html
Sovo
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
14.01.2017, 11:05 0

Данные с двух каналов АЦП по очередно.[Решено]

14.01.2017, 11:05. Просмотров 6278. Ответов 16
Метки (Все метки)

Ответ

Цитата Сообщение от ShodS
А какая может быть проблема, если не читать младший разряд?
Потом замахаешься искать, почему код то работает, то нет. АЦП устроен так, что при считывании первого байта второй считывается в промежуточный буфер. Если не считать второй, нарушается логика работы АЦП. В даташите картинки нарисованы.

У меня инит АЦП сделан так:
Код
#define ADC1_TDRH_MASK ((u8)((1 << (ADC1_CSR_CH8 - 8))      * 0 \
| (1 << (ADC1_CSR_CH9 - 8))      * 0 \
| (1 << (ADC1_CSR_CH10 - 8))   * 0 \
| (1 << (ADC1_CSR_CH11 - 8))   * 0 \
| (1 << (ADC1_CSR_CH12 - 8))   * 0 \
| (1 << (ADC1_CSR_CH13 - 8))   * 0 \
| (1 << (ADC1_CSR_CH14 - 8))   * 0 \
| (1 << (ADC1_CSR_CH15 - 8))   * 0))      // маска триггеров шмитта каналов 8-12

#define ADC1_TDRL_MASK   ((u8)((1 << ADC1_CSR_CH0)   * 1 \
| (1 << ADC1_CSR_CH1)   * 1 \
| (1 << ADC1_CSR_CH2)   * 1 \
| (1 << ADC1_CSR_CH3)   * 1 \
| (1 << ADC1_CSR_CH4)   * 1 \
| (1 << ADC1_CSR_CH5)   * 1 \
| (1 << ADC1_CSR_CH6)   * 1 \
| (1 << ADC1_CSR_CH7)   * 0))   // маска триггеров шмитта каналов 0-7

/*****************************************************************************
* Настройка АЦП
*****************************************************************************/
void init_adc (void)
{
// Инициализация АЦП
ADC1->CR1 &= ~ADC1_CR1_ADON;   // выключить АЦП для изменения настроек
ADC1->TDRH = ADC1_TDRH_MASK;   // маска используемых входов
ADC1->TDRL = ADC1_TDRL_MASK;   // маска используемых входов

ADC1->CSR = ADC_IN                   // измерять до входа 6
| ADC1_CSR_AWDIE   * 0      // запретить прерывания аналогового вочдога
| ADC1_CSR_EOCIE   * 1;   // Разрешить прерывание по окончании измерения
ADC1->CR1 = ADC1_CR1_SPSEL4            // частота преобразования 16МГц / 4 = 4 МГц
| ADC1_CR1_CONT    * 0      // режим однократного измерения
| ADC1_CR1_ADON      * 0;
ADC1->CR2 = ADC1_CR2_EXTTRIG   * 0      // внутренний триггер
| ADC1_CR2_EXTSEL   * 0      // внешний триггер не используется
| ADC1_CR2_ALIGN    * 0      // выравнивание влево
| ADC1_CR2_SCAN    * 1;   // Режим сканирования
ADC1->CR3 = ADC1_CR3_DBUF      * 1;   // с использованием буфера

ADC1->CR1 |= ADC1_CR1_ADON;            // включить АЦП
}
Использую сканирование сразу семи каналов.
Запускаю из прерывания таймера:
Код
/******************************************************************************
* Системное прерывание 1 мс
******************************************************************************/
INTERRUPT_HANDLER (SysTick_Timer_ISR, 23)
{
static u16         ADC_timer      = 0;

TIM4->SR1 = 0;   // Сбросим флаг прерывания
// счётчики работают с интервалом в 1 мс
system_time++;   // системный счётчик времени
if ((system_time - ADC_timer) >= ADC_TIMER)
{
ADC_timer = system_time;
ADC1->CR1 |= ADC1_CR1_ADON;   // запустить АЦП
}
}
И получаю результаты:
Код
static u8   buf [7];   // массив отсчётов ацп

/*****************************************************************************
* прерывание по окончании измерения
* здесь считывается напряжение сети
*****************************************************************************/
INTERRUPT_HANDLER (ADC1_End_of_conversion_ISR, 22)
{
u8 flags = ADC1->CSR;
flags &= ~ADC1_CSR_EOC;      // снять флаг прерывания
ADC1->CSR = flags;

buf [0] = ADC1->DB0RH;   // сохраняем значения
buf [1] = ADC1->DB1RH;
buf [2] = ADC1->DB2RH;
buf [3] = ADC1->DB3RH;
buf [4] = ADC1->DB4RH;
buf [5] = ADC1->DB5RH;
buf [6] = ADC1->DB6RH;

control_func ();
}
Кстати, при использовании буфера отпадает необходимость считывать два байта результата.

Вернуться к обсуждению:
Данные с двух каналов АЦП по очередно.[Решено]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2017, 11:05
Готовые ответы и решения:

АЦП несколько каналов
Нужно замерять сигналы с трех выводов АЦП МК, как это сделать грамотно?

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух...

Большое количество АЦП каналов
Здравствуйте! Подскажите микроконтроллеры с количеством АЦП 50 или больше каналов. И есть ли...

Переключение каналов АЦП atmega88
Добрый день. В который раз сталкиваюсь с АЦП на меге и никак не могу понять как правильно...

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