Вывод звука на STM32 + библиотека

Озадачился выводом звука (мелодий) на stm32 для одной поделки. Стал изучать материалы…
Задача: с минимальными ресурсами по CPU и памяти (а так-же с минимальным объема работ по подключению в коде) — выводить звук.
Итоги изысканий и результат:

Детали под катом…
UPDATE: Суть решения не выводе как таковом, а в формировании первоначального сигнала в коде. Я у себя использовал усилитель D-класса на рассыпухе. Но это не обязательно. Вывод можно делать и через DAC. Можно приделать любой усилитель. Можно использовать внешний DAC. Суть решения в пункте 2 и 3: генерация данных с минимум нагрузки на МК.
З.Ы. А вы обсуждаете первый пункт, который я применил в конкретном месте в конктерных условия, потому что мне так было проще…
З.З.Ы. Удалил часть про PWM, как не главную :)



Читать дальше

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

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



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




Читать дальше

Генерация синуса 50 Гц на AVR. Макетирование.

Начало здесь.

Руки чесались проверить идею, поэтому решил быстро собрать макет из подручных материалов. Генератор импульсов прошил в старую макетку с ATMega168PA:



Исходник и вспомогательная таблица есть в первой части статьи.

UPD: Осциллограммы!


Больше картинок!

Генерация синуса 50 Гц на AVR

КдПВ
Я недавно в форуме чисто теоретически поднимал вопрос о бесперебойнике с чистым синусом.

А тут еще стабилизатор сгорел, от которого котел газовый запитан был, да с такими спецэффектами сгорел, что до сих пор запах горелой изоляции в кухне. Слава Богу, УЗО отработало, проводка выдержала, в общем, обошлось.

Так что теория постепенно начала превращаться в практику, но пока (на уровне идеи) с использованием железного трансформатора от сгоревшего UPS, коих у меня накопилось уже много.

UPD: Добавил пару картинок


Читать дальше

8 канальный ШИМ на attiny13

AVR attiny13 довольно популярный микроконтроллер (далее МК) и довольно дешевый (20 рублей на ebay). Но есть у него небольшой недостаток: 6 пинов I/O. А на деле вообще 5 (если не шаманить с reset). Если надо большое кол-во пинов на вывод чем может позволить микроконтроллер, то с легкостью используется микросхема регистра сдвига 74HC595, которая потребует 3-х пинов. Потратив 3 пина, можно получить 8*N пинов для вывода(где N — кол-во микросхем 74HC595).

Если со статическим выводом всё ясно, то что делать с ШИМ (PWM)?


Читать дальше

pwm на verilog в три строки.

PWM или просто ШИМ, что это такое объяснять здесь не надо. Работает это дело через изменение скважности сигнала. Т.е ширины импульса, соотношение лог. 0 и лог 1 в сигнале. Как это описать программно, сказано дальше.


Читать дальше
  • +1
  • 11 октября 2012, 12:09
  • letni

"Волшебная коробка"

Решил сделать для любимой девушки оригинальный подарок своими руками. Это моя первая статься на блоге, так что не судите строго :))

Функционал устройства:

  • 7- программ миганния;
  • Переключенние между программами происходить по кнопке;
  • Переключенние между программами по таймеру, каждых 30с;
  • Отключение устройства по кнопке;
  • автоматичиское выключение при 5минутах неактивности.

Схема устройства очень простая — микроконтроллера ATmega8, красные светодиды, кнопки и батарейки питания (3 пальчика). Плату сделал двухслойной (не хотелось использовать перемычки).Разводил в Altium Designer, избыточно для такой прсотой платы использовать такую программу, но так как я с ней постоянно работаю — мне в ней удобно. Altium проект вконце статьи в архиве. Чтобы распечатать чертеж для ЛУТ сначала необходимо сгенерировать гербер, как сделать уже описано тут.

Вот так выглядит плата устройства в Altium Designer:



Визуализация платы в Altium Designer:



Плату поместил в сувенирную коробку:



Для программирования МК на плате есть разъем. Конечно он немного портыть выд устройства, но совсем не хотелось мучаться с проводами для прошивки. Я программировал через AVRISP mkII но можно использовать той что есть в у вас в наличии.
Прошивку писал в AVR Studio на язике С, не особо оптиммизировал. Частота работы МК 8MHz В программу очень легко вносить новые эффекты мигания. Кнопкой S2 включаеться устройство, S1 — переключючение программ мигания по кругу, после МК переходить в сон, и чтобы включить нужно нажать S2 (кнопка подключена к внешнему прерыванию). Если кнопка S1 не нажимаеться, через 30 секунд произойдет переключение на следующую программу мигания. Если нет активности пользователся, через 5хв устройство отключиться.

Программа огранизована в виде тасков. В прерывании таймера устанавливаеться флаг события, в главном идет обработка события и сбрасиваеться флаг:

volatile unsigned char BlinkMode = 0; //  какой ефект должен работать
volatile unsigned char  BlinkSpeed = 0; //скорость переключения
volatile unsigned char TaskFlag = 0; // переменная флагов для задачь

ISR(TIMER2_COMP_vect) // 1mS
{
	if (++count2 ==  BlinkSpeed)	
	{
		TaskFlag|= (1<<6); //set flag
		count2 = 0;
	}		
}

while(1)
{
    if (TaskFlag & (1<<6))
    {
        BlinkLedTask();
	TaskFlag&=~(1<<6); // clear flag
    }
}


Так происходить переключение программ мигания:

void BlinkLedTask(void)
{ 
	switch (BlinkMode)
	{
		case 0: Blink1(20);   break; 
		case 1: Blink2(50);   break; 
		case 2: Blink3(200);  break; 
		case 3: Blink4(255);  break;
		case 4: Blink5(150);  break;
		case 5: Blink6(90);   break;
		case 6: Blink7(250);  break;
		case 7: Sleep();      break;
	}	
}


Одна с функций мигания:
iBlinkSpeed
— параметр функции — скорость мигания.

EnableAll();
устанавливает лог «1» на аноды светодиодов.

PWM = 10;
минимальная яркость мигания светодиодов
PWM = 250;
максимальная яркость мигания светодиодов


void  Blink7(unsigned char iBlinkSpeed)
{
	static unsigned char num = 0;	
	
	BlinkSpeed = iBlinkSpeed;
	
	EnableAll();
	
	if (num == 0)
	{
		PWM = 10;
		num = 1;
	}
	else 
	{
		PWM = 250;
		num = 0;
	}
}


Для тех кто выдержал и дочитал:

Как работает устройство-видео

Файлы к статье:
we.easyelectronics.ru/attachments/get/1091
we.easyelectronics.ru/attachments/get/1092

Спасибо. Жду конструктивной критики и замечаний!)
  • +4
  • 08 сентября 2012, 00:05
  • Nemo
  • 2

Полномостовой ШИМ с рекуперативным торможением. Продолжение.

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


Читать дальше

очередная "Лампа настроения" с энкодером

После недели головной боли над неправильно работающим циклом вычисления цвета допилил прошивку к своей лампе настроения.
Микроконтроллер atmega32a (на самодельной макетке)
(почему такой монстр для такой фигни? да потому-что моя самодельная макетка сделана для 16й и 32й атмег, пока что без совместимости с аттинями, в планах сделать переходник с тиней и 8меги на DIP40 установленный на плате.
а код легко переносится на другие платформы
суть разработки заключается в полной разработке девайса, от идеи до реализации в готовом виде.
и да, это мой первый девайс который делается ОТ и ДО)
Светодиод обычный RGB с общим анодом, взят со светодиодной ленты. Катоды подключены к ШИМ выходам микроконтроллера через токоограничительные резисторы.
Энекодер самый обычный, с А В выходами, подключены к 1 и 2 пину порта А (0й пин не работает)
Цвет меняется вращением энкодера, направление учитывается.
765 цветов.


Читать дальше

LPCXpresso Урок 14. PWM. Синхронный ШИМ на таймере.

Прежде чем завершить курс для новичков рассмотрим такую всеми любимую и всем надоевшую тему как ШИМ.

Схема

Для данного урока нам надо подключить пару светодиодов к выводам P1.9 и P1.10 платы, через ток ограничительные резисторы (номиналом 100 Ом – 1 кОм):

Если вдруг под рукой у вас не завалялось ни одного светодиода, то можно поступить и так:



Читать дальше
  • +2
  • 23 сентября 2011, 08:49
  • angel5a
  • 1