Цифров синтез на сигнали с микроконтролер STM32F103 и външна R-2R матрица / Digital signal synthesis with STM32F103 microcontroller and external R-2R matrix
Статус на проекта: Замразен / Project status: Frozen
[БГ] Предистория (…. Или как възникна идеята за този проект). Преди няколко години най после се осмелих да реализирам една моя тийнейджърска мечта. Мечта с която почти всеки от вас е започнал това хоби или професия, а тя обикновено е да си направи супер аудиофилски усилвател. Речено сторено, на Aliexpress има достатъчно качествени китове за сглобяване – достатъчно качествени платки, по проверени в годините схеми – добър подбор на компонентите (най вече кондензаторите и транзисторите) от наша страна , добро трансформаторно захранване и май е това 😊. Да ама който е музикален инвалид като мен как ще разбере, че е постигнал мечтата си?! ….. ами за това си има генератори на тестови сигнали и осцилоскопи, нали така. Домашен осцилоскоп си имах, а генератор не, и понеже не ми се мъкнеше цялата прототипна установка до работа реших да си направя някакъв генератор за аудио сигнали. Кратко търсене в Гугъл доведе до резултата AVR DDS signal generator V2.0. Същото търсене в Aliexpress пък доведе до намирането на кит за сглобяване, накрая се получи резултат като този на картинката.
[EN] Background (…. Or how the idea for this project came about). A few years ago, I finally dared to realize one of my teenage dreams. A dream that almost every one of you started this hobby or profession with is usually to build yourself a super audiophile amplifier. All said and done, there are enough high-quality assembly kits on Aliexpress - enough high-quality boards, according to schemes tested over the years - a good selection of components (especially capacitors and transistors) on our part, a good transformer power supply and that's about it 😊. Yes, but who is musically disabled like me, how will he know that he has achieved his dream?! .... well, that's what test signal generators and oscilloscopes are for, right? I had at home oscilloscope, but no generator, and since I didn't bother with the whole prototype setup to my work place, I decided to make some kind of generator for audio signals. A quick google search brought up AVR DDS signal generator V2.0. The same search on Aliexpress led to the finding of a kit for assembly, in the end a result like the one in the picture was obtained.
[БГ] По същото това време за да не губя форма в програмирането се бях заел да разуча микроконтролерите на ST (до тогава бях работил само с PIC16, 8051 и 6800 архитектури – все 8 битови ). Та някак си от само себе си възникна идеята да направя и аз генератор с външна R-2R резисторна матрица. Замислените качества на продукта бяха следните:
- Готова Blue Pill платка, за да няма SMD монтаж на компоненти
- Без LCD, вместо него се използва USB интерфейса на процесора (включително и за генериране на сигнали със зададена от нас форма)
- Без потенциометри (амплитудата и офсета се управляват чрез R-2R матриците). За това и разредеността на основната матрица е толкова голяма – за да може да си играем с амплитудата на сигнала. По теория при използване на резистори с толеранс от 1% стъпката на DAC се покрива с толерансното отклонение след десетият разряден бит, иначе казано няма смисъл да правим външен DAC с R-2R матрица с разреденост по голяма от 10 при точност на резисторите от 1%. Може разбира се да ползваме 0,1% точност ама тяхната цена май е друга 😊
- Използване на DMA контролера на STM32F103 – това разтоварва ядрото за поддръжка на USB, обслужване на бутоните и т.н.
- 360 семпъла вместо 256 както е при AVR варианта (по качествено формиране на сигнала).
- Захранване през USB, при AVR варианта захранването се прави отделно и не е част от кита за сглобяване.
Ето така изглежда замисленият и реализиран прототип:
- Ready Blue Pill board so no SMD mounting of components
- No LCD, the USB interface of the processor is used instead (including for generating signals with the shape we set)
- No potentiometers (amplitude and offset are controlled via the R-2R matrices). That's why the sparseness of the main matrix is so large - so that we can play with the amplitude of the signal. In theory, using resistors with a tolerance of 1%, the DAC step is covered by the tolerance deviation after the tenth digit bit, in other words, it makes no sense to make an external DAC with an R-2R matrix with a sparseness greater than 10 with an accuracy of resistors of 1% . Of course, we can use 0.1% accuracy, but their price is probably different 😊
- Using the STM32F103's DMA controller - this offloads the kernel for USB support, button servicing, etc.
- 360 samples instead of 256 as in the AVR version (in terms of signal quality).
- Power supply via USB, in the AVR variant the power supply is made separately and is not part of the assembly kit.
- Направих прототипна платка, схемата можете да изтеглите от ТУК, а гербер файловете от ТУК . За съжаление поради допуснати технически грешки се наложиха корекции в опроводяването – червените проводници на снимките(портове от R-2R матриците / там където се формира сигнала са сгрешени). След корекциите платката беше достатъчно функционална да проведа основните тестове.
- Написах програма за микроконтролера, с реализация на USB интерфейс за контрол и управление на устройството. Предизвикателство беше да осъществя DMA трансфер на данни от кръгов буфер към паралелен порт (порт B на микроконтролера) В документацията се описва серийна комуникация или как да се използва вграден DAC на микроконтролер. Реално ако използвате метода който е тук това удвоява Samples per second спрямо микроконтролер със вграден DAC от същата серия. Успях да постигна 10,7 Mega Samples per second, по спомени за микроконтролерите от F103 със вграден DAC е 5,6 Mega samples per second.
- Написах програмата за комуникация чрез персонален компютър. Сорс кода е ТУК, компилираният вариант е ТОВА. Използвах изцяло API функции на Windows – това е най древният вариант за писане на програми под Win, но това ни дава възможност да стартираме програмата и на много стари Windows системи. Пък и с ръка на сърцето си признавам, че си беше някак носталгично да използвам API функции вместо някоя от модерните технологии. Аз до сега всъщност не бях писал под API, навремето започнах направо от MFC. Програмата няма нужда от инсталация, стартирате изпълнимият файл или ако ви е страх от вируси преглеждате сорса и го компилирате във Visual Studio.
[EN] What I was able to realize:
- I made a prototype board, you can download the schematic from HERE, and the gerber files from HERE. Unfortunately, due to technical errors, corrections were necessary in the wiring - the red wires in the photos (ports from the R-2R matrices / where the signal is formed are wrong). After the fixes, the board was functional enough to run the basic tests.
- I wrote a program for the microcontroller, with the implementation of a USB interface to control and manage the device. Challenge was to do a DMA transfer of data from a circular buffer to a parallel port (port B of the microcontroller) The documentation describes serial communication or how to use a microcontroller's built-in DAC. Actually, if you use the method here, it doubles the Samples per second compared to a microcontroller with a built-in DAC of the same series. I managed to achieve 10.7 Mega Samples per second, according to memories for microcontrollers from F103 with built-in DAC it is 5.6 Mega samples per second.
- I wrote the program for communication through a personal computer. The source code is HERE, the compiled version is HERE. I used Windows API functions entirely - this is the oldest option for writing programs under Win, but it allows us to run the program on very old Windows systems. Also, I admit with my hand on my heart that it was kind of nostalgic to use API functions instead of any of the modern technologies. I hadn't actually written under an API until now, back in the day I started straight from MFC. The program does not need installation, you run the executable file or if you are afraid of viruses you view the source and compile it in Visual Studio.
[БГ] Защо замразих проекта:
- Независимо от добрите резултати те не са в пъти по добри от тези които има AVR генератора. Работата по изчистване на аналоговата част, написването на цялостната функционалност на завършено за крайният потребител устройство е неоправдана за нещо което ще е с малко по добро от съществуващото
- На практика вече не може да се купи Blue Pill с оригинален STM32F103C8T6 процесор на достъпна цена, даже и да платите завишена цена (a първоначалната цел все пак е да създадем евтино устройство) много вероятно е да ви пробутат премаркиран GD процесор. За тях чувам че не са лоши и Blue Pill в Arduino среда си работи и с тях, но за мен за да мога да го програмирам под STM Cube IDE си беше предизвикателство. Наложи се да намеря достатъчно стара демо платка на която имаше ST Link със много стар фърмуер който не проверява автентичността на продукта и да работя със нея.
- В един момент осъзнах, че устройство без LCD (нали го заменихме с програма на компютър) невинаги ще е удобно за употреба.
- Съзрявайки във времето тази идея ме доведе до друга идея която смятам и да реализирам в бъдеще. Е, тази бъдеща идея вече я има на пазара, но си мисля че е възможно да се поевтини и да стане по достъпна за модификации според вкуса на съмишлениците - тоест вас.
- Regardless of the good results, they are not many times better than those of the AVR generator. The work of cleaning up the analog part, writing the overall functionality of a finished end-user device is unjustified for something that will be slightly better than the existing one.
- In practice you can no longer buy a Blue Pill with an original STM32F103C8T6 processor at an affordable price, even if you pay an inflated price (and the original goal is to create a cheap device after all) you are very likely to be pushed a rebranded GD processor. I hear that they are not bad and Blue Pill in Arduino environment works with them too, but for me to be able to program it under STM Cube IDE was a challenge. I had to find an old enough demo board that had ST Link with a very old firmware that doesn't verify the authenticity of the product and work with it.
- At one point I realized that a device without an LCD (we replaced it with a program on a computer) will not always be convenient to use.
- Maturing over time, this idea led me to another idea that I plan to implement in the future. Well, this future idea is already on the market, but I think it is possible to make it cheaper and more accessible for modifications according to the taste of like-minded people - that is, you.
[BG] Случайно запазила се картинка от тестовете. На нея се виждат осцилограмите от двата генератора AVR DDS и stm32dds, но коя от кой е нямам спомен. Може да се види и произведението на двете вълни (математическа функция умножение на осцилоскопа) – на практика пример за амплитудно модулиран сигнал.
[EN] Accidentally saved a picture from the tests. It shows the oscillograms from the two generators AVR DDS and stm32dds, but I have no memory of which one is from which. You can also see the product of the two waves (mathematical function multiplication of the oscilloscope) - in practice an example of an amplitude modulated signal.
[БГ] Май съм забравил да покажа екранна снимка от потребителският интерфейс на програмата за управление на генератора чрез персонален компютър 😊. Компенсирам този пропуск. Надявам се тези разработки да са полезни за някого, а защо не и да подтикнат някого да създаде нещо по добро!
[EN] I guess I forgot to show a screen shot of the generator control program's user interface via PC 😊. I compensate for this omission. I hope these developments will be useful to someone, and why not inspire someone to create something better!