СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №2/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 24 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 2 2015 трёх регистров. Ниже приводятся опи- сания этих режимов. Н ЕЗАВИСИМЫЙ ЗАПУСК БЕЗ ГЕНЕРАЦИИ Для настройки этого режима преоб- разования необходимо выполнить сле- дующие действия: ● включить оба канала установкой раз- рядов TEN1 и TEN2; ● задать источник запуска каждо- го из каналов установкой разрядов TSEL1[2:0] и TSEL2[2:0]; ● загрузить данные в нужный регистр DHR (DAC_DHR12RD, DAC_DHR12LD или DAC_DHR8RD). Когда появится сигнал запуска кана- ла 1, данные из регистра DHR1 будут перенесены в регистр DAC_DOR1. Ког- да появится сигнал запуска канала 2, данные из регистра DHR2 будут пере- несены в регистр DAC_DOR2. Перенос данных происходит через три такта APB1. Н ЕЗАВИСИМЫЙ ЗАПУСК С LFSR- ГЕНЕРАЦИЕЙ Для настройки этого режима преоб- разования необходимо выполнить сле- дующие операции: ● включить оба канала установкой раз- рядов TEN1 и TEN2; ● задать источник запуска каждо- го из каналов установкой разрядов TSEL1[2:0] и TSEL2[2:0]; ● сконфигурировать оба канала уста- новкой разрядов WAVEx[1:0] в 01 и задать значение маски регистра LFSR с помощью разрядов MAMPx[3:0]; ● загрузить данные в нужный регистр DHR (DAC_DHR12RD,DAC_DHR12LD или DAC_DHR8RD). Когда появится сигнал запуска кана- ла 1, значение счётчика LFSR1 с той же маской добавляется в регистр DHR1 и сумма переносится в регистр DAC_ DOR1 через три такта APB1. После это- го счётчик LFSR1 обновляется. Когда появится сигнал запуска кана- ла 2, значение счётчика LFSR2 с той же маской добавляется в регистр DHR2 и сумма через три такта APB1 перено- сится в регистр DAC_DOR2. После это- го счётчик LFSR2 обновляется. Н ЕЗАВИСИМЫЙ ЗАПУСК С РАЗДЕЛЬНОЙ LFSR- ГЕНЕРАЦИЕЙ Длянастройкиэтогорежимапреобразо- ваниянеобходимыследующие действия: ● включить оба канала установкой раз- рядов TEN1 и TEN2; ● задать источник запуска каждо- го из каналов установкой разрядов TSEL1[2:0] и TSEL2[2:0]; ● конфигурировать оба канала уста- новкой разрядов WAVEx[1:0] в 01 и задать различные значения маски регистра LFSR с помощью разрядов MAMP1[3:0] и MAMP2[3:0]; ● загрузить данные в нужный регистр DHR (DAC_DHR12RD,DAC_DHR12LD или DAC_DHR8RD). Когда сформируется сигнал запу- ска канала 1, значение счётчика LFSR1 с маской, заданной в MAMP1[3:0], добав- ляется в регистр DHR1 и спустя три так- та APB1 сумма переносится в регистр DAC_DOR1. После этого счётчик LFSR1 обновляется. Когда придёт сигнал запуска кана- ла 2, значение счётчика LFSR2 с маской, заданной в MAMP2[3:0], добавляется в регистр DHR2 и через три такта APB1 сумма переносится в регистрDAC_DOR2. После чего счётчик LFSR2 обновляется. Н ЕЗАВИСИМЫЙ ЗАПУСК С ГЕНЕРИРОВАНИЕМ ТРЕУГОЛЬНЫХ ИМПУЛЬСОВ Для настройки этого режима преоб- разования необходимо выполнить сле- дующие действия: ● включить оба канала установкой раз- рядов TEN1 и TEN2; Листинг 1 #include «stm32f10x.h» #include «stm32f10x_rcc.h» #include «stm32f10x_gpio.h» // Массив данных для генератора гармоничного сигнала синуса const uint16_t sin[32] = { 2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; unsigned char i=0; // Функция обработчика прерывания от таймера 6 void TIM6_DAC_IRQHandler(void) { TIM6->SR &= ~TIM_SR_UIF; // Сбросить флаг UIF DAC->DHR12R1=sin[i++]; // Записать в ЦАП очередной элемент массива if (i==32) i=0; // Если вывели в ЦАП все 32 значения – начать снова } int main(void) { // Включить порт RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Включить ЦАП RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // Включить таймер 6 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); // Настроить вывод ЦАП GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // Настроить частоту таймера TIM6->PSC = 0; TIM6->ARR = 500; TIM6->DIER |= TIM_DIER_UIE; // Разрешить прерывание от таймера TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт NVIC_EnableIRQ(TIM6_DAC_IRQn); // Разрешить TIM6_DAC_IRQn прерывания // Включить DAC1 DAC->CR |= DAC_CR_EN1; // Организовать бесконечный цикл while (1) {} }
RkJQdWJsaXNoZXIy MTQ4NjUy