Модульный генератор сигналов ad9833 stm32 stm8 sdcc как из него сделать генератор сигналов

Добавил пользователь Валентин П.
Обновлено: 18.09.2024

Система тактирования в STM32 в сравнении с микроконтроллерами AVR выполнена довольно замысловато. Давайте разбираться.

Содержание:

  • Шины
  • Генераторы
  • Тактирование периферии
  • Источники сигнала SYSCLK
  • HSE и PLL
  • Что еще?
  • Заключение

У микроконтроллеров STM32 все периферийные устройства (порты ввода-вывода, таймеры, интерфейсы SPI, и т.д.) подключены к так называемым шинам, через которые периферия получает тактовый сигнал и обменивается данными с ведущими устройствами шины (например, с процессором).

В STM32F103x8 три основных шины: AHB, APB1 и APB2. На каждой из шин висит определенная группа устройств:

  • AHB: процессорное ядро, память и DMA;
  • APB1: USART2, USART3, I2C1/2, CAN, таймеры TIM2..4;
  • APB2: порты GPIO, АЦП, USART1, TIM1, SPI1.

В даташите на STM32F103x8 есть блок-схема, в которой указано, какая периферия куда подключена:


Рис. 1. Блок-схема микроконтроллеров STM32F103x8 и STM32F103xB

Схема на рис. 1 поначалу может казаться сложной и непонятной, это нормально, со временем все в голове уложится и ощущение непонимания исчезнет.

А еще есть вот такая таблица, в которой так же указаны периферийные устройства и шины, к которым они подключены:


Рис. 2. Таблица шин и периферийных устройств

Можно заметить, что на рис. 2 возле названия шины (AHB, APB1 и APB2) в скобках указана ее максимальная частота. Так как периферийные устройства получают тактовый сигнал от шины, ее частота задает скорость работы подключенных к данной шине устройств. Далее мы рассмотрим, как настроить частоту каждой из шин микроконтроллера.

Еще одной особенностью системы тактирования STM32 является то, что после сигнала сброса микроконтроллера вся периферия находится в отключенном состоянии и на нее не подается тактовый сигнал. Это сделано с целью снижения энергопотребления всего микроконтроллера. Перед началом работы с любым периферийным устройством необходимо разрешить подачу на него тактового сигнала. Как это сделать рассмотрим далее.

Итак, вот основные тезисы, которые необходимо запомнить:

  1. Все периферийные устройства в микроконтроллерах STM32 подключены к шинам (AHB, APB1 и APB2), через которые производится взаимодействие с устройствами и подача на них тактовых сигналов;
  2. Шины микроконтроллера STM32 могут иметь разные частоты тактирования;
  3. Перед началом работы с периферийным устройством необходимо разрешить подачу на него тактового сигнала.

Генераторы

В микроконтроллерах STM32F103x8/B присутствует несколько генераторов тактового сигнала:


Рис. 3. Блок-схема системы тактирования, красными прямоугольниками выделены генераторы тактовых сигналов

Первый из них — встроенный RC-генератор на 8 МГц, который называется High-speed internal (HSI) RC oscillator. После сброса микроконтроллер по-умолчанию тактируется как раз от этого генератора. Основным его плюсом является то, что для работы генератора не нужны ни какие дополнительные внешние компоненты. Однако его минус — плохая стабильность генерируемой частоты: при изменении температуры окружающей среды его частота в 8 МГц будет немного плыть. Для нетребовательных ко временнЫм интервалам устройств это может быть не критично, но в некоторых случаях данная особенность является недопустимой.

Следующий — High-speed external (HSE). Этот генератор является альтернативой HSI. Для его работы нужен внешний кварцевый резонатор на частоту 4-16 МГц. Его главным преимуществом в сравнении с HSI является стабильность генерируемой частоты. Так же, при определенной настройке, вывод OSC_IN можно подключить к источнику готового прямоугольного тактового сигнала без использования резонатора.

Далее Low-speed external (LSE). Этот генератор так же требует внешнего кварцевого резонатора, но только на 32768 Гц. LSE используется только для тактирования встроенных часов реального времени RTC, с помощью которых можно вести отсчет текущего времени, если это нужно.

Последний генератор — это Low-speed internal (LSI) RC oscillator. Это встроенный RC-генератор на 40 КГц. Он не отличается особой точностью, однако у него есть очень важная задача: генерация тактового сигнала для сторожевого таймера МК, который перезапустит систему в случае зависания. А еще от LSI можно тактировать RTC, но скорее всего это ни кто делать не будет 😉

Тактирование периферии

Процессорное ядро и основная часть периферии использует тактовый сигнал SYSCLK.


Рис. 4. Распределение тактового сигнала SYSCLK

После делителя AHB Prescaler тактовый сигнал распределяется между шинами микроконтроллера. Сигнал HCLK поступает в процессорное ядро, память и периферию шины AHB. FCLK так же идет в ядро. Через фиксированный делитель на 8 тактирование подается на системный таймер Cortex System timer. Делитель APB1 Prescaler формирует сигнал тактирования устройств шины APB1, а APB2 Prescaler для устройств APB2.

Тут правда есть небольшая особенность формирования тактового сигнала для таймеров и АЦП.


Рис. 5. Распределение тактового сигнала шины APB1 между устройствами


Рис. 6. Распределение тактового сигнала шины APB2 между устройствами

Тактовый сигнал на таймеры подается следующим образом. Если делитель шины (APB1 Prescaler или APB2 Prescaler) установлен в единицу, то частота тактирования тактирования таймеров (TIMXCLK или TIM1CLK) будет равна частоте шины. Но, если делитель не равен единице, то частота тактирования таймеров будет в 2 раза больше частоты шины (см. рис. 5, 6). Вот так 😉 А для АЦП есть свой собственный делитель, который из частоты тактирования шины APB2 формирует сигнал ADCCLK (рис. 6).

Думаю, следует еще обратить внимание на вот эти элементы блок-схемы:


Это есть ни что иное, как устройства подачи тактового сигнала на конкретную периферию (логические элементы 2И). Попробую перерисовать один из них так, чтоб было понятнее, что это и как оно работает:


У каждого периферийного модуля в специальном регистре есть свой бит (SPI1EN, IOPAEN, IOABEN и так далее), при установке которого в единицу разрешается подача на него тактового сигнала. На рис. 8 я привел пример только для тактового сигнала PCLK2 шины APB2, для остальных сигналов (HCLK, PCLK1, TIMXCLK, TIM1CLK) все то же самое.

Источники сигнала SYSCLK

Итак, теперь мы знаем, что основным тактовым сигналом в микроконтроллерах STM32 является SYSCLK. Давайте теперь разберемся, как его получить. В нашем распоряжении 3 варианта: генераторы HSI, HSE и модуль PLL:


Рис. 9. Источники сигнала SYSCLK

После сброса микроконтроллера в качестве источника сигнала SYSCLK по-умолчанию устанавливается встроенный RC-генератор HSI. Прохождение тактового сигнала для этого случая представлено на рис. 10, значения по-умолчанию всех делителей обвел кружочком:


Рис. 10. Конфигурация системы тактирования по-умолчанию

А теперь давайте посчитаем значения всех частот в конфигурации по-умолчанию. Частоты HCLK, FCLK, PCLK1, TIMXCLK, PCLK2, TIM1CLK будут равны 8 МГц, частота Cortex System timer равна 1 МГц, а ADCCLK 4 Мгц.

Если мы хотим задействовать HSE-генератор, то картина будет следующей:


Рис. 11. Выбор генератора HSE в качестве источника тактирования SYSCLK

При использовании кварцевого резонатора на 8 МГц все системные частоты будут такими же, что и в предыдущем случае. Разница только в одном: при использовании генератора HSE стабильность частот лучше, чем при использовании HSI. Однако, если мы хотим получить максимальную производительность всей системы, то нужно в качестве источника SYSCLK использовать блок умножения частоты PLL.

HSE и PLL

В микроконтроллерах STM32 модуль PLL может тактироваться как от HSI генератора, так и от HSE. Существует огромное количество вариантов настройки тактирования системы от PLL. Мы остановимся только на одном, в котором используется HSE и все коэффициенты настроены на максимальную производительность системы:


Рис. 12. Схема прохождения тактового сигнала при использовании PLL совместно с HSE

Что еще?

Здесь мы не рассмотрели еще некоторые блоки системы тактирования, о которых хочется упомянуть.

Модуль часов реального времени RTC может тактироваться от встроенного LSI генератора на 40 КГц, от HSE через делитель на 128, либо от LSE с внешним кварцем на 32768 Гц. Источник тактовых импульсов выбирается с помощью RTCSEL.

Модуль USB получает тактовый сигнал от PLL, причем при частоте на выходе PLL равной 72 МГц есть возможность активировать USB Prescaler с коэффициентом деления 1.5 для получения необходимой частоты 48 МГц.

Microcontroller clock output (MCO) — вывод микроконтроллера, на который можно вывести частоту от одного из источников сигнала: SYSCLK, HSE, HSI либо сигнал с выхода PLL, поделенный пополам. Нужный источник выбирается с помощью битов MCO.

Заключение

Итак, мы рассмотрели основные моменты в системе тактирования микроконтроллеров STM32 на примере STM32F103x8 и STM32F103xB. В других микроконтроллерах STM32 примерно все то же самое, за исключением некоторых нюансов. В следующей части мы познакомимся с регистрами системы тактирования и сброса RCC и рассмотрим пример инициализации RCC.

У микроконтроллера STM32F103C8T6 достаточно высокая рабочая частота, номинальная 72 МГц, а в режиме Overclocked 128 МГц, благодаря этому STM32 можно использовать как импульсный генератор (меандр) с максимальной частотой 64 МГц, а в режиме ШИМ генератора с максимальной частотой 1.28 МГц и процентом коэффициента заполнения от 0 до 100.

Конечно на таком генераторе нельзя получить любую частоту от 0 до 64 МГц, частота меняется дискретно и зависит от делителя таймера, например при делителе 1 на выходе генератора будет частота равная 64 МГц, при делителе 2 32 МГц, при 3 21.333 МГц, при 4 16 МГц и так далее.

Минимальное значение делителя 1 (f = 64 МГц), максимальное 65535 (f = 1 кГц). Для удобства изменения частоты сделан множитель делителя х1 х10 х100 х1000, которой можно менять в процессе установки частоты.

Для управления работой генератора используются 4-е кнопки:

  • Выбор работы режима генератора — меандр / ШИМ
  • Выбор множителя делителя
  • Увеличение делителя
  • Уменьшения делителя

Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE


Режим Overclocked 128 МГц

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Случайные статьи

Индикатор выходной мощности с логарифмической шкалой

Индикатор выходной мощности выполнен на основе стрелочного индикатора М476\1, но можно использовать другой стрелочный прибор с полным током отклонения стрелки не более 200мА. Динамический диапазон индикатора 43дБ, а крайние значения регистрирующей мощности от 0,1 до 200Вт. Расширение динамического диапазона достигается применением ОУ. Р1(стрелочный прибор) включен в диагональ моста образованного диодами …Подробнее.

Светильник на солнечных элементах

На рисунке показана схема простого светильника на солнечных элементах. В светлое время суток происходит заряд аккумулятора (2,4 В) от солнечных элементов, в темное время суток загорается светодиод. В схеме используются 2 х АА никель-металлогидридные (Ni-MH) аккумуляторы имеющие общее напряжение 2,4 В на 500 мА·ч. Светодиод с током потребления на 50-80 мА. Солнечный …Подробнее.

Коммутатор зажигания на полевом транзисторе

Коммутатор предназначен для использования в бесконтактной системе зажигания автомобилей ВАЗ. Отличие от промышленного образца в том, что на выходе конструкции установлен мощный МДП-транзистор с изолированным затвором — IRF462 имеющий мощность до 300 и обеспечивающий ток через катушку зажигания до 10А, что в 1,5-2 раза превышает максимальный ток стандартного коммутатора. Благодаря …Подробнее.

LM4752 — УМЗЧ 2*11 Вт

LM4752TS — двух канальный усилитель мощности звуковой частоты. выходная мощность (номинальная) 11 Вт на канал при сопротивлении нагрузки 4 Ом и 7 Вт на канал при нагрузке 8 Ом. Схема усилителя содержит минимум внешних элементов, после сборки усилитель в настройке не нуждается. Технические параметры Напряжение питания от 9 В до 32 …Подробнее.

Преобразователь 5В / 8,5В

На рисунке представлена схема простого преобразователя напряжения, уст-во при питании +5В выдает напряжение +8,5В. Основа преобразователя триггере Шмитта. Генератор построен на ИС К555ТЛ2 работающий на частоте 20кГц, далее выходной сигнал поступает на умножитель напряжения VD1 – VD2. Во время перезарядки конденсатора С1 через резистор R1 образуются колебания. Когда напряжение на …Подробнее.

Микроконтроллеры STM8 состоят из нескольких линееек:
STM8S - основная линейка,
STM8A - для автомобильной промышленности,
STM8L - со сверхнизким потреблением энергии,
STM8T - емкостный сенсор для детектирования прикосновения или приближения.

STM8S103F3P6

Отладочную плату с микроконтроллером STM8 на борту можно приобрести за 1 (!) доллар и даже дешевле. Я приобрел несколько таких плат на основе микроконтроллера STM8S103F3P6 на торговой площадке ebay:

контакт назначение
D4 PD4 / UART_CLK
D5 PD5 / TX
D6 PD6 / RX
RST сброс
A1 PA1 / Oscin
A2 PA2 / Oscin
GND земля
5V вход стабилизатора
3V3 выход стабилизатора
A3 PA3 / SS
D3 PD3 / Ain4
D2 PD2 / Ain3
D1 PD1 / SWIM
C7 PC7 / MISO
C6 PC6 / MOSI
C5 PC5 / SCK
C4 PC4 / Ain2
C3 PC3
B4 PB4 / SCL (шина I2C)
B5 PB5 / SDA (шина I2C)

Для питания платы можно использовать следующие варианты:

  • подключение источника напряжением 4,5 . 15 В к контактам + или 5V и - или GND;
  • подключение кабеля к microUSB-разъему (этот разъем используется только для питания!);
  • подключение источника питания напряжением 3,3 В к контактам 3V3 и - или GND.


Использование компилятора SDCC

Пишем код программы в файле TST.c:

Выполняем компиляцию программы командой

При компиляции создается hex-файл TST.ihx:

ST-LINK V2

Для прошивки платы я приобрел на торговой площадке ebay программатор ST-LINK V2:

STM8 программатор

При первоначальном подключении к USB-порту компьютера программатор определяется как "неизвестное устройство" с VID 0483 и PID 3748:

прошивка STM8

На сайте ST доступен драйвер для программатора - STSW-LINK009:

как прошить STM8

После его установки при повторном подключении программатор распознается как "устройство USB":

Разъем программатора имеет 10 контактов:

Номер Название Назначение
1 RST сброс
2 SWIM SWIM-интерфейс (для STM8)
3 GND земля
4 3.3V + 3,3 В
5 5.0V + 5 В
6 SWCLK синхронизация (SWD-интерфейс, для STM32)
7 SWDIO данные (SWD-интерфейс, для STM32)
8 GND земля
9 3.3V + 3,3 В
10 5.0V + 5 В

ST-LINK V2 контакты

Для подключения программатора к плате я использую 4 контакта на разъеме программатора и на плате - 3.3V(3V3), SWIM(SWM), GND, RST(NRST):

При общении программатора с платой используется коммуникационный протокол SWIM (через однопроводной интерфейс - контакт SWIM).

Для прошивки я использую утилиту stm8flash, для запуска которой следует выполнить команду:

Бинарная версия проекта для ОС Windows (можно взять здесь) содержит два необходимых файла:

stm8flash.exe - исполнимый файл
libusb-1.0.dll - библиотека для доступа к USB-устройствам

прошивка STM8

После запуска утилиты она выполняет прошивку программы в память и отчитывается о числе записанных байт:

После прошивки указанной выше программы мигания светодиодом он начинает мигать с периодом около шести секунд.

Visual Studio Code

обновление прошивки STLINK

Прошивка программатора может быть обновлена с помощью утилиты, доступной для скачивания на сайте ST - STSW-LINK007:

После запуска приложения (для Windows - ST-LinkUpgrade.exe) необходим присоединить программатор к USB-порту компьютера, нажать кнопку Device Connect - при этом отобразятся текущая версия прошивки программатора (Version) и его тип (Type), а также версия, до которой можно обновить прошивку (Upgrade to Firmware). Для запуска процесса обновления прошивки необходимо нажать кнопку Yes>>>>.

Работа в редакторе Visual Studio Code

Для написания исходного кода программы, а также для автоматизации процесса компиляции и прошивки удобно использовать бесплатный редактор Visual Studio Code от компании Microsoft (страница загрузки).

STM8 Visual Studio Code

Вот как выглядит исходный код программы в Visual Studio Code:

Для удобства работы следует создать папку (например, sdcc), в которой будут располагаться файлы проектов для STM8. Затем следует добавить эту папку в рабочую область. В эту же папку помещаем файлы:

  • compile.cmd - с содержимым: c:/sdcc/bin/sdcc -mstm8 --std-c99 %~n1.c ,
    где c:/sdcc - папка компилятора SDCC
  • flash.cmd - с содержимым: stm8flash -c stlinkv2 -p stm8s103f3 -w %1
  • stm8flash.exe
  • libusb-1.0.dll

В этой папке следует создать папку .vscode, в которой разместить файл tasks.json с таким содержимым:

Этот файл описывает две задачи:

  • compile - компиляция текущего открытого файла с исходным кодом (с расширением .c)
  • flash - прошивка скомпилированного ранее hex-файла (c расширением .ihx)

Выбирая соответствующую задачу ("Задачи" > "Запустить задачу. ")

можно запустить:
компиляцию

прошивку

Полезные подсказки

задание базовых адресов портов:

установка режима порта (DDR - регистр направления порта):

настройка вывода N порта X (PXN) на выход

настройка вывода N порта X (PXN) на вход

вывод (ODR - регистр выходных данных):

установка вывода N порта X (PXN) в состояние "1" :

установка вывода N порта X (PXN) в состояние "0" :

подключение заголовочных файлов

STM8 UART

Вот как выглядит собранная схема из микроконтроллера, USB-UART преобразователя и программатора:

(1/16000000)*65536*предделитель = интервал в секундах
10 секунд = 2441 0x0989

Необходимо задать номер канала АЦП, соответствующего используемому входу (например, вывод D2 - канал 3).

Напряжение можно определить умножением считанного из АЦП значения на VCC/1023, где VCC - напряжение питания на шине 3.3V.
Например, при подключении к входу 3.3V STM выхода 3.3V преобразователя USB-UART напряжение на нем составило 3,24 В. При этом масштабный коэффициент равен 3,24/1023 = 0,00317 В.

Пример простейшего проекта, мигающего светодиодом

Разработка в среде IdeaSTM8

Установка среды разработки

IdeaSTM8

Для программирования под микроконтроллеры STM8 можно использовать среду разработки IdeaSTM8 от компании Cosmic Software (в версии CXSTM8 special edition package - доступна с марта 2016 года, не имеет ограничений):

В качестве примера создадим программу мигания светодиодом (Hello, world! в мире микроконтроллеров) TEST, размещенным на плате и подключенным к контакту PB.5.

IdeaSTM8 создание проекта

Создаем новый проект, выполняя команду New Application:

STM8 программирование

Выбираем в качестве целевой платформы микроконтроллер STM8S103F3:

Копируем в папку проекта заголовочный файл с определениями stm8s.h, предварительно раскомментировав в нем определение используемого микроконтроллера STM8S103:

Создаем новый файл (tst.c) с исходным кодом:

Cosmic Software

создаем файл:

программа для STM8

выбираем в качестве типа файла - файл с исходным кодом на C:

IdeaSTM8 программирование

Добавляем созданный файл в проект:

Пишем код программы в созданном файле:

сборка проекта для STM8

Для компиляции и сборки проекта следует нажать клавишу F7 или выполнить команду Build:

В результате сборки в папке проекта создается файл с именем проекта и расширением .sm8 (TST.sm8).

Для преобразования файла с расширением .sm8 в готовый для прошивки в микроконтроллер hex-файл я использую COSMIC Software Hexa Translator (chex.exe) с помощью команды:

где TST - имя проекта.

Полученный hex-файл (TST.hex) содержит информацию, необходимую для прошивки микроконтроллера:

Для прошивка этого файла в память микроконтроллера можно использовать описанный выше программатор ST-LINK V2.

Мои проекты на STM8

Преобразователь PS/2 - UART

Преобразователь для проекта cpm4nano позволяет подключать PS/2-клавиатуру через последовательный порт (UART).

Дистанционно управляемая аэролодка

Микроконтроллер STM8 принимает сигнал ИК-пульта и управляет движением модели аэролодки.

wdrakula аватар

Но сдвиг фазы ТОЛЬКО на целое число микросекунд, в гет-вейв() сам посмотришь.

Меандр делается двумя прерываниями из ДМА: полуготовность и готовность. Нужно будет сам разберешься.

Если тебе фаза нужна точнее 1 мкс, то самое лучшее меандр выдавать на неподвижный синус (который на PB7), а двигать PA8 через массив, как раньше было. Иначе нужно городить еще один таймер, а это бред. Но и с этим помогу, если будет минута и желание.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Большое спасибо это много работы - излучаю. Мой генератор работает на 7 kHz, фазовая точность 0.1 градусов.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Большое спасибо это много работы - излучаю. Мой генератор работает на 7 kHz, фазовая точность 0.1 градусов.

Ну вот опять придется обзываться!

1.Ду. нь! Это в формуле у тебя было 0.1, а в реальности все это съедается. Ты хоть понимаешь как ИМЕННО эта программа генерит синус? Кто тебе это писал? Попроси пояснить,а я не нанимался в коррекционные педагоги. ;)

Я потому и спросил про 1 мкс, что не знаю для чего тебе все это. Какая точность фазы на самом деле нужна? Если ты параметры звукового тракта измеряешь, то 1 мкс - достаточно, если это лабораторное исследование, то хрен его знает.

2. в первом посте генератор был на 72000000/2000/102=352 Гц.

Не 7 КГц, мля, а 352Гц! В 20 раз меньше.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

короче так: я, возможно (без обещаний. ), захочу написать тебе нормальный код бесплатно.

С тебя требуется тут, в этой теме, четко и ясно описать что ты делаешь. Описать своим языком, свою задачу. Не пытаясь что-то говорить про програмирование.

Твоя попытка вставить третий таймер говорит, не то что о улевом, а об отрицательном уровне подготовки. Поэтому прошу говорить о своей цели.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Первый вариант - ошибка, поэтому я дал второй вариант. Моя цель - добавить 3 канала - прямоугольные импульсы с той же фаз ой , что и на A7

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Новый код с самого начала не нужно, слишком много работы LM386 работает хорошо, как я уже писал, я хотел заменить его программой.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

я прелагаю сделать прямоугольные синфазно PB7, а двигать PA8. Поскольку фазу можно двигать как в + так и в - - это проще. Тебе просто в подключении нужно поменять входы.

Короче, пиши, что и для чего ты используешь. Иначе я мозг себе сломаю, что-то объясняя.

Сейчас на моем коде выстави частоту и поиграйся пока с ним.

Завтра расскажешь. Я человек не молодой, мне спать пора.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Первый вариант - ошибка, поэтому я дал второй вариант. Моя цель - добавить 3 канала - прямоугольные импульсы с той же фаз ой , что и на A7

Ты, блин, плохо соображаешь?! Я прошу сказать, что ты делаешь, то есть зачем ты это используешь. А не что от программы хочешь. Твои хотелки - скорее всего полная чушь и решаются без изнасилования STM32.

Меандр синфазно PA8 я тебе УЖЕ сделал,в коде выше. Поиграй с ним пока. Посмотри осцилографом.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

В вашей программе на B8 и B9 ничего нет. Но A8 - имеются очень узкие импульсы. Если бы они были в фазе с оригинальным A8, тогда это было бы хорошо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Моя цель - добавить 3 канала

должно быть - добавить третий канал

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

поменял A9 на B12, A9 и A10 будет использоваться для Serial Plotter, пытаюсь добавить эту строчку _ Serial.println (sine1, sine2);

Я хочу сделать металлоискатель с минимальным количеством аналоговых частей, следующий в очереди, - AD8302 amplitude/ phase detector - фазометр. Сколько будет стоить чобы его заменить ?

Парень, который написал эту программу, знает программирование, но не знает электроники, ему потребовалось много времени, чтобы написать эту программу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Дык они ж закомментированы!

Я не могу понять, ты на код смотришь как на шумерскую клинопись или, все-таки, читаешь его?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я псравнял с моим ничего не нашел.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Теперь поехали, раз уж появиласьреальная информация.

1. Код это писали долго. Написана херня, с которой тяжело работатьи тяжело модифицировать.

Нет, не безграмотно, по своему забавно, но "из пушки по воробьям".

1. 7000Нц тебе нужно фиксированно или нужно перестраивать?

2. какие выходы тебе нужны? два синуса со смещением фазы и меандр синфазно одному из них, так?

3. Какие регулировки? сечас фаза и амплитуда одного из синусов. Что еще нужно? Какие у тебя кнопки ? (матрица, просто тактовая на землю или что еще?)

4. Про прием? АЦП у СТМ32 - не сильно хорош в смысле шума Какая чувствительность по фазе и амлитуде тебе нужна.

5. если добавлять прием двух каналов на АЦП и измерение их параметров то код уже никуда не годится. Он сейчас уже почти всю память забил.

У синуса нет смысла держать весь период. Не больше 1/4 периода. все остальное проще пересчитывать на ходу. но если одновременно прием, вместо AD8302, то смотреть на что ресурсов хватит. Это будетзависеть от частоты синуса и количества самплов.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Я псравнял с моим ничего не нашел.

Это про что? Если про кнопки, то коментарий сними с них. Я ими вообще не интересовался.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

сорри за опечатки . дерьмовая резиновая китайская клава на кухне. Половину букв не нажимаетили нажимает не те ;););) Очень она пробел не любит!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

про синус: если знаешь, то насколько чистый он тебе нужен? Коэфф. гармоник допустимый есть в теории ваших металлоискателей?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Извините, мой первый пост был ошибкой, о которой я писал, второй хороший - я буду искать

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Парень, который написал эту программу, знает программирование, но не знает электроники, ему потребовалось много времени, чтобы написать эту программу.

Извини, ОФФТОП, я маразмы и приколы коллекционирую.

А "много" это сколько именно времени?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Извините, мой первый пост был ошибкой, о которой я писал, второй хороший - я буду искать

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

В моем варианте искажения не делают проблемы, в твоей версии выглядит хорошо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А "много" это сколько именно времени?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

если добавлять прием двух каналов на АЦП и измерение их параметров то код уже никуда не годится. Он сейчас уже почти всю память забил.

так что вроде места еще навалом? Или я что-то не учел?

компиляция Ардуино ИДЕ 1.6.12, плата STM32F103C8T6

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

если добавлять прием двух каналов на АЦП и измерение их параметров то код уже никуда не годится. Он сейчас уже почти всю память забил.

так что вроде места еще навалом? Или я что-то не учел?

компиляция Ардуино ИДЕ 1.6.12, плата STM32F103C8T6

если ты не заметил, то массивы самплов синусов я сделал динамическими и они не в глобальных теперь. А они и жрут всю память

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

в моей программе все работает правильно, нет памяти для амплитуды (для фазы есть). Частота фиксируется программой в диапазоне от 7 кГц до 15 кГц.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я буду искать кнопки, подумайте о ph-метре

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

если ты не заметил, то массивы самплов синусов я сделал динамическими и они не в глобальных теперь. А они и жрут всю память

Почему не заметил - заметил. Если взять данные из твоего же скетча, там два массива по sqrt(72MHz/ 900 Hz) сэмплов - то есть два массива по 282 значения - это добавляет всего 1к.

Дисклаймер - Я не спорю, я понять хочу - это правильно или я что напутал

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

вот тебе с кнопками. Моя вина, я пересчет убрал пока проверял. и так его тебе и кинул. ;)

Как говориться "и про старушку снимают порнушку"! ;)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

прямоугольные импульсы (A9) можно использовать для запуска таймера, чтобы остановить - сигнал от приемника

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

если ты не заметил, то массивы самплов синусов я сделал динамическими и они не в глобальных теперь. А они и жрут всю память

Почему не заметил - заметил. Если взять данные из твоего же скетча, там два массива по sqrt(72MHz/ 900 Hz) сэмплов - то есть два массива по 282 значения - это добавляет всего 1к.

Дисклаймер - Я не спорю, я понять хочу - это правильно или я что напутал

Если сделать, как ТС хочет еще один канал на таймере, то это еще память, и если принимать два канала, то нужно еще два массива хотя бы по 1000 на прием.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

прямоугольные импульсы (A9) можно использовать для запуска таймера, чтобы остановить - сигнал от приемника

ты прямоугольные проверь! я не смотрел они синфазно или противофазно. переставлять их с А9 можешь куда угодно.

формируются они в fun2()

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

в моей программе все работает правильно, нет памяти для амплитуды (для фазы есть). Частота фиксируется программой в диапазоне от 7 кГц до 15 кГц.

5. а с чем сравнивать будешь? уровень то измерить не проблемма, а фазу нужно сравнивать, так с чем?

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

Понимаешь ли ты, что AD8302 СРАВНИВАЕТ фазы на двух своих входах? а остальное - тупое измерение уровня сигнала, доступное на чем угодно?

Вот я и спрашиваю, фаза относительно чего? в твоем понимании, если без AD8302.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Если сделать, как ТС хочет еще один канал на таймере, то это еще память, и если принимать два канала, то нужно еще два массива хотя бы по 1000 на прием.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Оригинал был: для фазы шаг настройки 1/100 от 180 градусов. Время настройки от 0 до 180 градусов 3 минуты. Амплитуда -шаг 30 мВ

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

5. а с чем сравнивать будешь? уровень то измерить не проблемма, а фазу нужно сравнивать, так с чем?

прямоугольные импульсы (A9) можно использовать для запуска таймера, чтобы остановить - сигнал от приемника

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Сейчас шаг для фазы 60 градусов, для амплитуды гдето 100 мв но только 3 шага - сам идиот туда и обратно

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я снова загрузил , амплитуда регулируется почти как надо, фаза не регулируется.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

DetSimen аватар

У тебя рюсске не родной, штоле?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

ok. пробуй пиши. Я - до завтра.

Шабат, самогон и все эти вещи.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

фаза сдвигается большими шагами в одну сторону

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

нужно уменьшить шаг настройки амплитуды в 10 раз и записать переменные в ЕЕПРОМ, регулировка фазы не работает.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

wdrakula аватар

Так. Вот тебе код с работающими кнопками по фазе и амплттуде.

Теперь про точность регулировок:

Что за каша в твоей голове, и что ты хочешь - ты объяснил, теперь о грустной реальности.

В данный момент, при частоте 7000Гц и частоте самого контроллера в 72 МГц, мы имеем шаг дискретизации в генераторе синуса 1/100 периода и шаг амплитуды тоже 1/100 от максимальной, то есть от 3 вольт.

Это понятно? Понятно ли, что это не свойство программы, а законы физики и математики? Вот это ВАЖНО понять!

то есть шаг амплитуды 30 мВ и точность фазы, при любом шаге в программе, не выше 360/100=3.6 градуса.

Следовательно тебе нужно решить, что ты хочешь улучшить из двух параметров: точность установки фазы или амплитуды?

поясню: 72МГц / 7КГц = примерно 10000. Это 100 самплов по 100 единиц. амплитуда при этом способе генерации - целочисленная - от 0 до 50.

Фаза - тут чуть лучше, но синус создается импульсами ШИМа, посмотри картинку на осцилографе., точность фазы после фильтра не выше количества импульсов на период, то есть не больше 0,01 периода, что равно 3.6 гр.


Вот это то, что реально выдается на порту PB7 (вот прямщас снял ;) ), в синус это превращается RC фильтром. По синусу меняется скважность от импульса к импульсу, понятно?

Поскольку произведение числа самплов на на количество отсчетов в самле у нас 10000, то мы можем увеличить одно, только уменьшив другое, это ясно?

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

В коде: B7 - не меняет амплитуду, А8 - меняет, А9 - меандр синфазно А8. кнопки работают все четыре.

Читайте также: