Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. ADC (АЦП). Пример кода

Для самого запуска ADC, в нашем случае это ADC1->8 канал, и его работы по оцифровке входного сигнала нужно совсем немного:
1) Настройка тактирования нужного порта (GPIOB).
2) Настройка входного пина PB0 на котором находится 8 канал ADC1 (см. Документацию вывода ножек. Нас интересует "третье" состояние ножки - аналоговый режим, не путать с режимом альтернативной функции или тем более режимом обычного ввода/вывода). Тут нам понадобится всего один регистр GPIOB_MODER.
3) Настройка тактирования ADC1. Из физической схемы или карты адресного пространства видно, что ADC находятся на шине APB2. В регистрах тактирования RCC_APB2ENR находим бит ADC1EN, устанавливающий тактирование нужного нам ADC (ADC1).
4) Переходим к настройкам самого ADC. Устанавливаем бит ADDON регистра ADC1_CR2, который включит ADC. В этом режиме ADC потребляет незначительное количество энергии, и находится в состоянии покоя.
5) В этот же регистр ADC1_CR2 установим бит CONT (режим непрерывного преобразования).
6) В первые 5 битов регистра ADC1_SQR3 установим номер канала для преобразования (8 канал). В следующие биты этого регистра, задаются другие номера каналов если нужно их считывать по очереди.
7) Устанавливаем бит SWSTART регистра ADC1_CR2, который запускает процесс преобразования.
8) Ждем появления флага EOC в статусном регистре ADC1_SR, сигнализирующий о конце преобразования. Флаг сбрасывается аппаратно после чтения регистра данных ADC1_DR.
9) Читаем преобразованные данные с регистра ADC1_DR.


  1. int main(void){
  2. RCC_GPIO|=0x2;
  3. GPIOB_MODER|=0x3;
  4. RCC_ADC|=0x100;// Установка тактирования ADC1
  5. ADC1_CR2=0x1;// Включаем ADC1
  6. ADC1_CR2|=0x2;// Постоянное преобразование
  7. ADC1_SQR3=8;// Номер канала
  8. ADC1_CR2|=0x40000000;// Запуск процесса преобразования
  9. while(1){
  10. while((ADC1_SR&0x2)!=0x2){}
  11. USART2_DR=ADC1_DR;// Отправляем данные куда нужно
  12. }
  13. }

Комментариев нет:

Отправить комментарий