Описание

Поступила задача разработать генератор синусоидального сигнала 60 Гц с точностью до 1%. Устройство должно быть максимально дешевым в массовом производстве, и все компоненты должны быть доступны для заказа (т. е. не вышедшими из производства).
Я предложил клиенту использовать микроконтроллер stm8s003, т. к. цена на них на сегодняшний день одна из самых низких на рынке 8-битных МК. Нашли по 0.2$ в катушечном исполнении.

Тактовый генератор на кварцевом резонаторе 16 мГц, выход-ШИМ сигнал с частотой 62.5 КГц, сглаженный простым RC-фильтром. Есть дополнительный выход для отладки (светодиод) — меандр 2 Гц, сигнализирующий о правильной работе генератора.

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

Код генератора для генерации таблицы, 255 байт:
  1. #define RAD_360 6.283185307165f
  2. //Sin waveform generation
  3. for (uint16_t i=0;i<255;i++)
  4. {
  5. float x_rad = RAD_360/((float)ARR_VAL)*((float)i);
  6. x_rad = sin(x_rad);
  7. float sin_res = (((float)ARR_VAL)/2.0f)*(x_rad+1.0f);
  8.  
  9. wave_table[i] = round(sin_res);
  10. }
Генератор работает на прерывании от TIM4 по переполнению. Тактовая частота таймера — 4 мГц. TIM2 используется в качестве ШИМ.

Скриншот с ISDS205x. Желтая линия — сигнал с устройства, голубая — c DDS-генератора осциллографа: