Меню

Stm32 генератор синусоидального сигнала

Многоканальный DDS генератор на STM32

Библитека позволяет генерировать сигналы нескольких форм (синус, прямоугольник, треугольник, пила), и микшировать произвольное количество каналов:

.h: codetidy.com/4013/
.c: codetidy.com/4014/

Генерация — по принципу DDS, с 16-битным аккумулятором фазы.
Количество каналов определяется константой AUDIO_GEN_CHANNELS, количество тонов на канал — AUDIO_GEN_TONES, частота дискретизации — AUDIO_GEN_F.

Настройки каналов хранятся в массиве audio_gen_channels[AUDIO_GEN_CHANNELS].

Итак, для работы нужно определить несколько констант:

Настройки отдельных тонов определяет функция audio_gen_tone_set:

Форма сигнала задается константами:

Для синуса используется таблица четверти периода на 64 отсчета sine_tab, остальные сигналы рассчитываются без таблиц.

Расчет инкремента фазы для базовой частоты base_freq, и генерируемой частоты tone_freq — функция audio_gen_phase_inc:

Перерасчет выходов выполняет функция audio_gen_update, которую нужно вызывать из прерывания таймера з заданной частотой AUDIO_GEN_F.

В результате выход каждого тона попадает в audio_gen_channels[c].tone[t].out, выход микшера — в audio_gen_channels[c].out.

Остается этот результат вывести на выход ЦАПа.

Примеры сигналов:

  • треугольник 440Гц:
  • треугольники 50+440Гц:
  • синусы 50+440+1500Гц:
  • треугольник 50Гц + синус 440Гц:
  • меандр 50Гц + пила 440Гц:

Пример настройки таймера и ЦАПа STM32F100/24MHz, программное обновление ЦАПа (можно пойти дальше, и писать отсчеты в буфер, из буфера обновлять ЦАП через DMA):

Внизу прикреплена программа генерации с записью результата в .raw файл, который можно открыть в любом редакторе как Signed 16-bit, big-endian.

Можно написать парсер MML или RTTTL — получится неплохая озвучка для устройств на МК.

Комментарии ( 19 )

Для синуса используется таблица четверти периода на 64 отсчета sine_tab

А не пробовал применить недавно обсуждавшийся тут простой генератор синуса? Что-то вроде X[n+1] = X[n-1] — K*X[n] (мог перепутать порядок отсчетов).

И еще по поводу картинок. Желательно, во первых, убрать у них align’ы (если есть, но у тебя вроде нет, они на самом деле задают обтекание картинки текстом), а во вторых — отделить их от текста переводами строки:

И все же, почему не прикрепить эти файлы к топику, в архиве?

простой генератор синуса? Что-то вроде X[n+1] = X[n-1] — K*X[n] (мог перепутать порядок отсчетов)

Правда, только к концу статьи понял, что речь идёт о STM32 > 0

Источник

2-x фазный ШИМ (PWM) генератор на STM32F030F4

Для питания ряда устройств (например электродвигателей переменного тока) иногда необходимо наличие сдвинутых по фазе питающих напряжений. Для питания 2-х фазных индукционных двигателей необходимо наличие двух фаз синусоидального напряжения с частотой 400 Герц и сдвинутых по фазе на 90 градусов. Один из примеров таких двигателей являются двигатели серии ДИД. Они интересны тем, что их частота вращения может составлять от 16000 до 18000 об/мин. Для питания таких двигателей и было сделано данное устройство, которое представляет собой задающий генератор 2-х фазного 400 Гц напряжений сдвинутых по фазе на 90 градусов относительно друг друга.
В качестве микроконтроллера использован STM32F030F4. Его выбор обусловлен его «минимализмом» — наименьший из корпусов в серии STM32F0 и естественно с минимальной стоимостью. Схема подключения изображена ниже. Микроконтроллер работает на частоте 48 МГц. В качестве задающего генератора использован TIM3, так как в данном контроллере только этот таймер можно конфигурировать так, чтобы использовать выходы трех каналов. Третий канал можно в случае необходимости использовать для генерации 3-фазного напряжения. Таймер работает в режиме генерации ШИМ (PWM). Для получения синусоидального напряжения 400 Гц в канале используется высокочастотное изменение коэффициента ШИМ с частотой 40 кГц, на которую настроен системный таймер SysTick. Синусоида формируется с помощью таблицы значений синуса с шагом 360/100 градусов. Очень полезный калькулятор для такого рода таблиц можно найти на сайте. При желании с помощью АЦП можно управлять амплитудой, фазой, частотой генерации. Но в данной реализации это не сделано.

Читайте также:  Ремонт генератора vw bora

Ниже показаны выходные осциллограммы генератора. Синяя и фиолетовая синусоиды — сдвинуты на 90 градусов, желтая — выход таймера для синей синусоиды, зеленый — тестовый сигнал генерируемый при начале формирования синусоиды

Ниже приводится текст программы для STM32F030F4. При желании данный принцип можно реализовать и на STM32F103 вариант для STM32F103.

const int table[125]= <
240,255,270,285,300,314,328,342,
356,369,381,393,404,415,425,434,
443,450,457,463,468,472,476,478,
480,480,480,478,476,472,468,463,
457,450,443,434,425,415,404,393,
381,369,356,342,328,314,300,285,
270,255,240,225,210,195,180,166,
152,138,124,111,99,87,76,65,
55,46,37,30,23,17,12,8,
4,2,0,0,0,2,4,8,
12,17,23,30,37,46,55,65,
76,87,99,111,124,138,152,166,
180,195,210,225,240,
//
240,255,270,285,300,314,328,342,
356,369,381,393,404,415,425,434,
443,450,457,463,468,472,476,478
>;

void ConfigureHSE(void)
<
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;

if (HSEStatus == 0x01)
<
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

/* HCLK = SYSCLK / 1 */
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

/* PCLK = HCLK / 1 */
RCC->CFGR |= RCC_CFGR_PPRE_DIV1;

/* Select HSE as system clock source */
// RCC->CFGR &=

(RCC_CFGR_SW_PLL);
// RCC->CFGR |= RCC_CFGR_SW_HSE;
RCC->CFGR |= RCC_CFGR_SWS_PLL;
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till HSE is used as system clock source */
// while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE)
// <
// >
>
else
< /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
>
>

int main(void)
<
ConfigureHSE(); //only for quarz synhro
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
GPIOA->MODER = (GPIOA->MODER &

(GPIO_MODER_MODER7)) | (GPIO_MODER_MODER7_1);
GPIOA->MODER = (GPIOA->MODER &

(GPIO_MODER_MODER6)) | (GPIO_MODER_MODER6_1);
GPIOB->MODER = (GPIOA->MODER &

(GPIO_MODER_MODER1)) | (GPIO_MODER_MODER1_1);
GPIOA->AFR[0] |= 0x11000000;
GPIOB->AFR[0] |= 0x00000010;

TIM3->PSC = 0; //APBCLK=48 MHz
TIM3->ARR = 480;
TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
TIM3->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
TIM3->CCMR2 |= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4PE;

TIM3->CCER |= TIM_CCER_CC1E;
TIM3->CCER |= TIM_CCER_CC2E;
TIM3->CCER |= TIM_CCER_CC4E;
TIM3->BDTR |= TIM_BDTR_MOE;
TIM3->CR1 |= TIM_CR1_CMS_0 | TIM_CR1_CEN;
TIM3->EGR |= TIM_EGR_UG;
SysTick_Config(1200); // 40 kHz
__enable_irq ();
t1=0;
t2=0;
while (1)
<
__WFI();
>
>
///////////////////////////////////////////////////////////////////////////
void SysTick_Handler(void)
<
t1++;
if(t1>=100)
t2++;
if(t2>=100)

TIM3->CCR1=(table[t2+25]);
TIM3->CCR2=(table[t1]);
TIM3->CCR4=table[t1+50];
>

Источник

Программирование двухфазного генератора с синусоидальными напряжениями со сдвигом 90° на микроконтроллере STM32

Дата публикации: 03.06.2017 2017-06-03

Статья просмотрена: 945 раз

Библиографическое описание:

Емельянов, А. А. Программирование двухфазного генератора с синусоидальными напряжениями со сдвигом 90° на микроконтроллере STM32 / А. А. Емельянов, В. В. Бесклеткин, А. Ю. Иванин, Д. И. Пестеров. — Текст : непосредственный // Молодой ученый. — 2017. — № 22 (156). — С. 6-12. — URL: https://moluch.ru/archive/156/44201/ (дата обращения: 11.09.2021).

Целью данной работы является программирование студентами на лабораторном стенде ШИМ-сигналов, сдвинутых на 90°. Программирование производится в среде CooCox CoIDE.

Для реализации этой цели необходимо решить следующие задачи:

‒ Формирование синусоидального базового сигнала в цифровой форме с помощью задания углов, определяемых как 2π/125;

‒ Включение тактирования периферийных устройств;

‒ Ввод функции инициализации:

а) Назначение портов ввода-вывода (GPIO – General Ports Input/Outputs);

б) Инициализация таймера (TIM1);

в) Инициализация ШИМ с обязательным включением комплементарных каналов.

‒ Описание функции прерывания (SysTick_Handler);

‒ Формирование массива, соответствующего новому сигналу, сдвинутому на 90° по отношению к базовому сигналу.

Алгоритм набора кода в программе CoIDE состоит в следующем:

  1. Запускаем среду программирования CooCox CoIDE.
  2. После запуска CooCox CoIDE в строке меню нажать: Project → New Project.
  3. В появившемся окне в поле «Project name» ввести имя своему проекту.
  4. Далее нужно выбрать поле с надписью «Chip».
  5. Появится окно с выпадающими списками различных фирм микроконтроллеров (рис. 1). Необходимо открыть список ST, затем из выпадающего списка открыть подсписок STM32F103x, после чего найти микроконтроллер STM32F103C8, выбрать его левым щелчком мыши и нажать Finish (рис. 2).
  6. После проделанных действий появится главное окно с репозиторием для выбора необходимых для проекта библиотек (рис. 3). Необходимо подключить следующие библиотеки:
Читайте также:  Чем паять диоды генератора

а) RCC – для управления тактовым генератором;

б) GPIO – для управления портами ввода-вывода;

в) TIM – для управления таймерами.

Рис. 1. Выбор фирмы микроконтроллера

Рис. 2. Выбор микроконтроллера

Рис. 3. Выбор библиотек в репозитории

  1. После выбора необходимых библиотек в панели файлов нужно выбрать файл «main.c», весь код будет находится здесь.
  2. С помощью директивы «#include <>» необходимо подключить заголовочные файлы (рис. 4).

Рис. 4. Подключенные библиотеки

  1. Далее нужно ввести все структуры, которые будут использоваться в коде, а также ввести массив для построения синусоидальной ШИМ (рис. 5). Массив имеет тип «uint16_t», что означает, что данный массив не имеет отрицательных значений, а также числа, входящие в этот массив, могут принимать значения в диапазоне от 0 до 65535.

Рис. 5. Ввод структур и массива синуса

  1. Для удобства восприятия кода программа была разделена на несколько подпрограмм (функций). Вначале необходимо ввести и заполнить функцию «void initRcc(void)» (рис. 6) для включения тактирования всех используемых периферийных устройств. Данная функция имеет тип «void».

Рис. 6. Функция включения тактирования

  1. Следующим шагом будет ввод и заполнение функции инициализации всех периферийных устройств «void initAll(void)». Данная функция, как и предыдущая, также имеет тип «void». Но так как она имеет большой объем, необходимо разбить ее на участки:

а) Назначение портов ввода-вывода (рис. 7). Все выводы назначены как альтернативные функции с двумя состояниями;

Рис. 7. Назначение GPIO в функции initAll()

б) Инициализация таймера TIM1 (рис. 8);

Рис. 8. Инициализация таймера

в) Инициализация ШИМ (рис. 9);

г) Необходимо инициализировать системный таймер. Для этого нужно написать функцию SysTick_Config(), в аргументах которой указывается частота тактирования. Необходимо указать частоту 1200, в итоге должно получиться SysTick_Config(1200).

  1. После ввода и заполнения функции тактирования необходимо заполнить функцию прерывания SysTick_Handler (рис. 10), в которой будет проходить процесс записи значений массива в регистры сравнения таймера.

Рис. 10. Описание функции прерывания

  1. После того как все функции были введены и заполнены, нужно объявить их перед функцией «int main()» (рис. 11).

Рис. 11. Объявление функций

  1. Следующим шагом необходимо записать данные функции между фигурными скобками в «main()» (рис. 12). Цикл «while» в этом проекте останется пустым. После этого код можно считать завершенным.

  1. После написания кода программы, его необходимо скомпилировать. Для этого в панели инструментов нужно нажать «Build». В случае успешной компиляции в консоли появится надпись «BUILD SUCCESSFUL», а также будет указан размер программы. Если в коде присутствуют ошибки, то в консоли будет указано, где именно находятся эти ошибки, а также появится надпись «BUILD FAILED».
  2. После завершения компиляции последним этапом станет загрузка рабочей программы в микроконтроллер. Для этого нужно через специальный кабель (удлинитель USB) подключить программатор, расположенный на лабораторном стенде, к компьютеру. После подключения в панели инструментов нажать «Download Code to Flash» и дождаться окончания загрузки. В случае удачной загрузки в консоли появятся надписи: «Erase: Done»; «Program: Done»; «Verify: Done». Если существуют проблемы с подключением платы к компьютеру, то появится надпись «Error: Connect failed, check config and cable connection». Необходимо проверить кабель, к которому подключено устройство.
Читайте также:  Пониженное в генераторе автомобиле

Общий вид лабораторного стенда представлен на рис. 13.

Рис. 13. Лабораторный стенд для исследования сдвига двух сигналов на 90°

‒ 1 – Вывод первого синусоидального сигнала, подключен к выводу A8 на микроконтроллере;

‒ 1К – Вывод первого комплементарного сигнала, подключен к выводу B13 микроконтроллера;

‒ 2 – Вывод второго синусоидального сигнала, сдвинутого на 90°, подключен к выводу A9 на микроконтроллере;

‒ 2К – Вывод первого комплементарного сигнала, подключен к выводу B14 микроконтроллера;

Результаты исследования сдвига двух сигналов на 90° показаны на рис. 14.

Рис. 14. Осциллограмма сдвига двух сигналов на 90°

  1. Анучин А. С. Системы управления электроприводов: учебник для вузов / А. С. Анучин. – М.: Изд. дом МЭИ, 2015. – 373 с.
  2. Огородников И. Н. Микропроцессорная техника: введение в Cortex-M3: учеб. пособие / И. Н. Огородников. – Екатеринбург: изд-во Урал. Ун-та, 2015. – 116 с.
  3. Джозеф Ю. Ядро Cortex-M3 компании ARM. Полное руководство / Ю. Джозеф; пер. с англ. А. В. Евстифеева. – М.: Додэка-XXI, 2012. – 552 с.
  4. ST Microelectronics. RM0008 Reference manual. STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs. Rev 16 — 2015.

Похожие статьи

Программирование прямого и комплементарного ШИМ-сигналов.

GPIO, комплементарный ШИМ-сигнал, BUILD, лабораторный стенд, инициализация таймера, верхний ключ, настройка, нижний ключ, функция, монтажная плата.

Программирование синусоидального и пилообразного сигналов.

Синусоидальный сигнал аппаратно получить нельзя, поэтому рекомендуется использовать ЦАП совместно с DMA для отправки значений синуса в регистр ЦАП.

RCC – для управления тактовым генератором; ‒ GPIO – для управления портами ввода-вывода

Программирование трехфазного генератора с синусоидальными.

1) Назначение портов ввода-вывода (GPIOGeneral Ports Input/Outputs); 2) Инициализация таймера (TIM1)

‒ Отправка значений массивов сигналов с помощью прямого доступа к памяти (DMA) в регистры сравнения таймера (TIM1).

Программирование изменения скважности импульсов ШИМ на.

а) Назначение портов ввода-вывода (GPIOGeneral Ports Input/Outputs); б) Инициализация таймера (TIM4)

Если же в коде присутствуют ошибки, то в консоли будет указано, где именно находятся эти ошибки, а также появится надпись «BUILD FAILED».

Регулирование скважности сигнала при помощи аналогового.

1) Назначение портов ввода-вывода (GPIOGeneral Ports Input/Outputs)

RCC – для управления тактовым генератором

Первая функция будет использоваться для инициализации таймера (TIM1) и настройки первого ШИМ-канала.

Подключение акселерометра, выполненного по MEMS-технологии.

Кроме портов SPI и светодиодно необходимо настроить вывод CS, который отвечает за подключение акселерометра.

Листинг функции, отвечающей за инициализацию акселерометра

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET)

Лабораторный стенд для отладки периферийных схем.

Все ресурсы микроконтроллера, такие как порты ввода/вывода, ячейки памяти и таймер, представляют собой физически

Цифрами обозначены основные блоки лабораторного стенда: Порты ввода RA0, RA1 и RA4 предназначены для подачи сигналов на микроконтроллер.

Разработка лабораторного стенда для изучения работы.

Библиографическое описание: Митин В. А. Разработка лабораторного стенда для изучения работы с модулями ввода-вывода

В стенде присутствует генератор частоты, позволяющий генерировать ШИМ-сигналы, подаваемые на быстродействующие входы контроллера.

Источник

Adblock
detector