СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №3/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 41 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 3 2015 Листинг 3 //========================= // Функция инициализации АЦП //========================= void Init_ADC(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORTA // Сконфигурировать PORTA.3 как аналоговый вход GPIOA->CRL &= ~GPIO_CRL_MODE3; // Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF3; // Очистить биты CNF // Сконфигурировать PORTA.4 как аналоговый вход GPIOA->CRL &= ~GPIO_CRL_MODE4; // Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF4; // Очистить биты CNF // Сконфигурировать PORTA.5 как аналоговый вход GPIOA->CRL &= ~GPIO_CRL_MODE5; // Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF5; // Очистить биты CNF // Сконфигурировать PORTA.6 как аналоговый вход GPIOA->CRL &= ~GPIO_CRL_MODE6; // Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // Очистить биты CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Включить тактирование АЦП RCC->CFGR &= ~RCC_CFGR_ADCPRE; // Задать значение делителя тактовой частоты ADC1->CR1 = 0; // Обнулить регистр управления ADC1->CR2 |= ADC_CR2_CAL; // Пуск калибровки while (!(ADC1->CR2 & ADC_CR2_CAL)){}; // Ждать окончания калибровки ADC1->CR2 = ADC_CR2_JEXTSEL; // Выбрать источником запуска разряд JSWSTART ADC1->CR2 |= ADC_CR2_JEXTTRIG; // Разрешить внешний запуск инжектиро- ванной группы ADC1->CR2 |= ADC_CR2_CONT; // Включить режим непрерывного преобразования ADC1->CR1 |= ADC_CR1_SCAN; // Включить режим сканирования нескольких каналов ADC1->CR1 |= ADC_CR1_JAUTO; // Автоматический запуск инжектированной группы ADC1->JSQR = (uint32_t)(4-1)<<20; // Задать количество каналов в ин- жектированной группе=4 ADC1->JSQR |= (uint32_t)3<<(5*0); // Номер первого канала для преоб- разования=3 ADC1->JSQR |= (uint32_t)4<<(5*1); // Номер второго канала для преоб- разования=4 ADC1->JSQR |= (uint32_t)5<<(5*2); // Номер третьего канала для преоб- разования=5 ADC1->JSQR |= (uint32_t)6<<(5*3); // Номер четвертого канала для пре- образования=6 ADC1->CR2 |= ADC_CR2_ADON; // Включить АЦП ADC1->CR2 |= ADC_CR2_JSWSTART; // Пуск преобразования } //========================= // Главный модуль программы //========================= void main(void) { unsigned int ai[4]; // Инициализация переменных Init_ADC(); // Выполнить инициализацию и пуск АЦП // Другие команды … while(1) // Бесконечный цикл { // Считать результат преобразования ai[0]=ADC1->JDR1; // Канал 3 ai[1]=ADC1->JDR2; // Канал 4 ai[2]=ADC1->JDR3; // Канал 5 ai[3]=ADC1->JDR4; // Канал 6 // Другие команды … } } в которой задействован режим непре- рывного преобразования АЦП. Данная программа запускает режим непрерывного преобразования задан- ного канала, и АЦП постоянно опра- шивает выбранный канал, помещая результат в регистр данных. Поэтому в основной программе не требуется регулярно запускать АЦП. При таком способе в регистре ADC_DR информа- ция об уровне сигнала на входе канала будет постоянно обновляться. Обновле- ние будет происходить с периодично- стью, которую можно изменять. В рассмотренных примерах можно запустить непрерывное преобразова- ние для одного канала. Если нужно сде- лать это для нескольких каналов, то без использования прерываний или блока ПДП не обойтись, так как для регуляр- ной группы предусмотрен всего один регистр данных. Однако если количе- ство каналов не превышает четырёх, то подобным образом можно исполь- зовать и преобразование инжектиро- ванных каналов. Максимальное количество каналов для инжектированной группы равно четырём. Для каждого такого канала предусмотрен свой регистр для хра- нения результата преобразования. Допустим, необходимо опрашивать четыре канала с номерами: 3, 4, 5 и 6. Для этого можно запустить непрерыв- ное измерение группы из четырёх инжектированных каналов. При этом АЦП будет автоматически сканировать четыре заданных канала, и помещать результат в регистры данных ADC_ JDR1, ADC_JDR2, ADC_JDR3 и ADC_JDR4. При этом можно будет считывать дан- ные из нужного канала в любое время. Пример такой программы приведён в листинге 3. После выполнения приведённой функции инициализации АЦП в реги- страх данных инжектированной груп- пы результаты преобразования, задан- ные в программе каналов, будут регу- лярно обновляться. Поэтому данные результаты можно будет считывать в произвольное время по мере необ- ходимости. Подробнее ознакомиться с блоком АЦП микроконтроллера STM32 мож- но на сайте [2]. Л ИТЕРАТУРА 1. www.st.com . 2. www.st.com/web/en/resource/tech- nical/document/reference_manual/ CD00246267.pdf.
RkJQdWJsaXNoZXIy MTQ4NjUy