72 МГц делятся на 100 кода

Тед
Пн, 01 января 2018 г. 1:59
STM32F103 работает на уровне 72 МГц, я считаю, что простой код может разделить его на 100, что даст 0.72 МГц Шин. Может быть, кто -то знает, как написать такой код ?
int outputPin = PA6; //output pin void setup() { // put your setup code here, to run once: pinMode(outputPin, OUTPUT); //or ? pinMode(out1, PWM); Serial.begin(9600); // ??? } void loop() { // put your main code here, to run repeatedly: // 72 MHz dividing by 100 code ??? // Serial.println( ???); // Serial.print (???); // print result of dividing, PWM on pin PA6 }

Дэнниф
Пн, 01 января 2018 г., 17:15
простой код Какой простой код?
Может быть, кто -то знает, как написать такой код ? Одним из типичных процессов было бы поиск таблицы данных и выяснить, как работает деление часов.

Еще один типичный процесс - попросить кого -то еще написать это для вас.


Пито
Вторник 02 января 2018 г. 8:38 утра
Например (я сомневаюсь, что это будет работать ровно на 720 кГц, однако), протестирован: HardwareTimer pwmtimer(3); uint16_t maxduty, duty; uint32_t myperiod, mypulse; void setup() { pwmtimer.pause(); myperiod = 20; // PWM period in useconds, 20 -> freq = 50KHz maxduty = pwmtimer.setPeriod(myperiod); pwmtimer.refresh(); pwmtimer.resume(); pinMode(PA7, PWM); } void loop() { mypulse = 5; // 0<=mypulse<=period, this is my High pulse length in useconds duty = map((int32_t)mypulse, 0, (int32_t)myperiod, 0, (int32_t)maxduty); pwmWrite(PA7, duty); // 0<=duty<=maxduty while(1){}; }

Тед
Вторник 02 января 2018 г. 16:26
Что я должен положить в скобки сериал ?

#include int outputPin = PA6; //output pin void setup() { // put your setup code here, to run once: pinMode(outputPin, OUTPUT); //or ? pinMode(out1, PWM); Serial.begin(9600); // ??? } void loop() { SPI.setClockDivider(SPI_CLOCK_DIV128); Serial.println( ???); // Serial.print (???); // print result of dividing, PWM on pin PA6 } /* SPI.setClockDivider(SPI_CLOCK_DIV16); // (72 MHz / 16 = 4.5MHz) The SPI1 works on APB2 (72 MHz). The maximum frequency that works the SPI1 is 72/2 =36 MHZ. The SPI2 works on APB1 (36 MHz). The maximum frequency that works the SPI2 is 36/2 =18 MHZ. The available dividers are: CODE: SELECT ALL SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 SPI_CLOCK_DIV256 */

Тед
Вторник 02 января 2018 г. 16:35
Без проверки - ошибка
div_100_a: 17: ошибка: «период» не был объявлен в этой области

duty = map ((int32_t) mypulse, 0, (int32_t) период, 0, (int32_t) maxduty);

^

Статус выхода 1
«Период» не был объявлен в этом объеме

Тед
Вторник 02 января 2018 г. 16:42
Вы можете попытаться получить доступ к регистрам таймера непосредственно для достижения более быстрых результатов.
Вывод на PA7 = 550 Гц

Пито
Вторник 02 января 2018 г. 16:54
Обновлено источник - см. Выше.
Также я проверил первый источник, и он работает здесь на Bluepill.
Второй источник расследования.

Тед
Вторник 02 января 2018 г., 17:05
Нет реакции, когда я меняю числа в кронштейне
pwmtimer.setPrescaleFactor(4); // Timer input clock Prescaler = 1 (= 36MHz input ?) pwmtimer.setOverflow(0.5); // PWM Period width for 720kHz ?

Тед
Вторник 02 января 2018 г., 17:11
Также я проверил первый источник, и он работает здесь на Bluepill.
Когда я собираю первую версию, я упомянул ошибку

Стивестронг
Вторник 02 января 2018 г., 17:18
Вы можете установить только целочисленные значения для регистров таймера, поэтому плавания не будут работать.

Тед
Вторник 02 января 2018 г., 17:22
Версия № 1 работает после второго раз - скопируйте и вставьте свой код.
Частота составляет 50 кГц, пульс с 25%.
Я буду играть с номерами.
Большое спасибо

Тед
Вторник 02 января 2018 г., 17:33
Обновленная версия № 2 также работает, вывод - 1.4 МГц

Пито
Вторник 02 января 2018 г., 17:40
Я снова обновил второй источник и дважды проверил с моим счетчиком.
Кажется, входные часы 72 МГц и мне нужно "100-1" Чтобы получить точное 720 кГц (720.045 кГц здесь).. :ржу не могу: 98 = 727.319 kHz 99 = 720.045 kHz 100 = 712.916 kHz 101 = 705.927 kHz

Тед
Вторник 02 января 2018 г., 17:46
Я изменил цифры в этих двух строках = хорошие квадраты, 720 кГц, 50% пошлина.
pwmtimer.setOverflow(100); // PWM Period width for 720kHz ? pwmtimer.setCompare(TIMER_CH2, 50); // PWM High Pulse width is 50% duty (1:1)pwmtimer.setOverflow(100); // PWM Period width for 720kHz ? pwmtimer.setCompare(TIMER_CH2, 50); // PWM High Pulse width is 50% duty (1:1)

Тед
Вторник 02 января 2018 г., 17:51
Мне просто любопытно, могу ли я разделить это снова на 100 и получить 7.2 кГц на PIN PA6 ?

Пито
Вторник 02 января 2018 г., 17:58
получить 7.2 кГц на PIN PA6 ? Вот вы, сэр: HardwareTimer pwmtimer(3); void setup() { pinMode(PA6, PWM); pwmtimer.pause(); pwmtimer.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer.setOverflow(10000-1); // PWM Period width for 7200 Hz ? pwmtimer.setCompare(TIMER_CH1, 5000); // PWM High Pulse width is 50% duty (1:1) pwmtimer.refresh(); pwmtimer.resume(); } void loop() { }

Тед
Вторник 02 января 2018 г. 18:00
Вторая обновленная версия идеальна

Тед
Вторник 02 января 2018 г. 18:04
Спасибо
Могу ли я иметь обе частоты, PA7 = 720 кГц и PA6 = 7.2 кГц ?

Пито
Вторник 02 января 2018 г. 18:06
Да, но PA7 = 720 кГц и PA3 = 7,2 кГц - просто объедините приведенные выше C -Bources вместе - также прочитайте мой предыдущий пост. HardwareTimer pwmtimer3(3); HardwareTimer pwmtimer2(2); void setup() { pinMode(PA7, PWM); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer3.setOverflow(100-1); // PWM Period width for 720kHz ? pwmtimer3.setCompare(TIMER_CH2, 50); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); pinMode(PA3, PWM); pwmtimer2.pause(); pwmtimer2.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer2.setOverflow(10000-1); // PWM Period width for 7,2kHz ? pwmtimer2.setCompare(TIMER_CH4, 5000); // PWM High Pulse width is 50% duty (1:1) pwmtimer2.refresh(); pwmtimer2.resume(); } void loop() { }

Тед
Вторник 02 января 2018 г. 18:11
Я попробую это
Вы можете объединить оба, чтобы получить 720K/7K на PA7/6.

Тед
Вторник 02 января 2018 г., 18:12
еще раз спасибо

Пито
Вторник 02 января 2018 г. 18:20
PA7/PA6 - Нет, см. Мой предыдущий источник..
Вы не можете объединить таймер3 с 2 разными периодами ШИМ, он кажется.
Вам нужно два разных таймера, как я сделал выше.. он работает с PA7/PA3.. :)
См. Timerx/Channely Allocation - PWM3/2 означает Timer3->Канал2:
.
STM32 Bluepill Pin Diagram.jpg
Схема Pin Pin STM32.JPG (209.41 киб) просмотрено 338 раз

Тед
Вторник 02 января 2018 г. 18:42
Просто объедините выше
Я попробую это.
Последний ваш код, pa7 = ok, pa6 = нет сигнала

Пито
Вторник 02 января 2018 г. 18:44
Объединенные источники: ViewTopic.PHP?F = 19&t = 3037&начало = 10#p39347
Также прочитайте мои посты выше..
Hth

Тед
Вторник 02 января 2018 г. 18:46
Так что я могу забрать PWM2 ?

Тед
Вторник 02 января 2018 г., 19:12
Объединенные источники:
Работает идеально, у меня 720 кГц и 7.2 кГц.
Спасибо
Теперь я приду к тому, чтобы полностью понять, как это работает.

Пито
Вторник 02 января 2018 г., 19:17
Посмотрите на картинку с распределением PWM PINC и просто возьмите таймер и канал для конкретного вывода, который вы хотите использовать.
Некоторые шпильки Timerx/Channely удваиваются - это означает, что они могут быть перенесены с помощью SW.

Тед
Вторник 02 января 2018 г., 19:23
Конечно, я думаю, что могу это сделать.
На форуме есть хорошие люди, просто трудно встретиться с ними.

Тед
Вторник 02 января 2018 г. 20:38
Таймер имеет 4 монтажных выхода;
1. Для квадратной волны мы можем использовать высокий/низкий навод ?
2. Один из ШИМ может генерировать синусоидальную волну на дополнительной штифте?

Тед
Ср. 03 января 2018 г. 5:17 утра
Я отключил две строки, а программа работает в порядке, это вызовет проблемы ?
// Use timer 2 HardwareTimer pwmtimer2(2); void setup() { pinMode(PA3, PWM); // pwmtimer2.pause(); pwmtimer2.setPrescaleFactor(100); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer2.setOverflow(100-1); // PWM Period width for 7,2kHz ? pwmtimer2.setCompare(TIMER_CH4, 50); // PWM High Pulse width is 50% duty (1:1) // pwmtimer2.refresh(); pwmtimer2.resume(); } void loop() { }

Стивестронг
Ср. 03 января 2018 г. 9:40
Почему вы отключили эти строки? У вас есть проблемы, если вы это сделаете?
Если нет, я бы порекомендовал оставить эти строки включенными, если вы хотите использовать ту же последовательность в другом контексте, они могут быть важными.

Тед
Ср. 03 января 2018 13:03
Нет причин отключения, я узнал, что делает каждая строка. Я очень доволен этой программой и спасибо за помощь. Теперь я понимаю PWM 95%
Отключение этих линий сделает микроконтроллер менее занятым ?
Я думаю, не так много.

Стивестронг
Ср. 03 января 2018 г. 15:23
Эти строки будут вызваны один раз на этапе установки, поэтому они не будут оставлять дальнейшие ресурсы MCU.

Тед
Ср. 03 января 2018 г., 17:35
После указания я посмотрел на программу и вижу, что это очевидно.

Пито
Ср. 03 января 2018 г., 17:46
Если вы не начнете модулировать PWM с помощью данных.. :)

Тед
Ср. 03 января 2018 г., 19:41
Я не думал об этом, еще раз спасибо, что упомянули это.
Какое у вас изображение - выдержанная скульптура ?

Тед
Ср. 03 января 2018 г. 8:10 вечера
Так что я могу модулировать ШИМ по синусоидальной волне, но как ?

Тед
Ср. 03 января 2018 г., 21:08
Какой я должен выбрать ?

#1 function y = sin3(x) n = 1 : 1000; for i = 1 : length(x) y(i) = x(i).*prod(1 - x(i)^2 ./ (n*pi).^2); end

Mrburnette
Чт, 04 января 2018 г. 15:58
[Тед - Ср. 03 января 2018 13:03] - <...>
Отключение этих линий сделает микроконтроллер менее занятым ?
Я думаю, не так много.
Существует опасность, что я не отвечаю на это утверждение, поскольку оно может быть прочитано и интерпретировано пользователем, не являющимся хард-программным обеспечением как означает, что в UC отключение периферийных интерфейсов будет запускать UC быстрее. Это не тот случай.

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

Что делает микроконтроллер «занято»-это код запуска/инициализации, а затем код пользователя, который осуществляет различные периферийные действия. Некоторые периферийные устройства, такие как PWM, потребляют полосу пропускания, когда они настроены, но после этого не потребляйте время выполнения пользователя, если не изменится код пользователя. Конечно, когда ШИМ активен, электрическая мощность потребляется, потому что это устройство активно и складывается на выходной штифт.

Изображение

Тед
Чт, 04 января 2018 г., 17:29
Большое спасибо за объяснение, это очень полезно.

Тед
Ср 28 февраля 2018 г. 8:02
Почему я не могу получить сигнал на PB4, но только на PA6, они оба являются PWM 3/1 ? То же самое с другими булавками, PA7, PA5 и т. Д. /* HardwareTimer pwmtimer(3); void setup() { pinMode(PA6, PWM); pwmtimer.pause(); pwmtimer.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer.setOverflow(10000-1); // PWM Period width for 7200 Hz ? pwmtimer.setCompare(TIMER_CH1, 5000); // PWM High Pulse width is 50% duty (1:1) pwmtimer.refresh(); pwmtimer.resume(); } void loop() { } */ HardwareTimer pwmtimer(3); void setup() { pinMode(PB4, PWM); pwmtimer.pause(); pwmtimer.setPrescaleFactor(1); // Timer input clock Prescaler = 1 (= 72MHz input ?) pwmtimer.setOverflow(10000-1); // PWM Period width for 7200 Hz ? pwmtimer.setCompare(TIMER_CH1, 5000); // PWM High Pulse width is 50% duty (1:1) pwmtimer.refresh(); pwmtimer.resume(); } void loop() { }

fpistm
Ср 28 февраля 2018 г. 10:49
У Pa5 нет таймера.
PA7 использует таймер 3 с каналом 2
PB4 использует таймер 3 с каналом 1, но это альтернативная функция (afio_tim3_partial). Вы должны убедиться, что AF установлен должным образом.

Наверное, вы могли бы попробовать добавить: afio_remap(AFIO_REMAP_TIM3_PARTIAL);

Mrburnette
Ср 28 февраля 2018 г. 13:25
Мнение:

Любой, кто надеется успешно работать с таймерами, должен быть знаком с конкретным справочным руководством STM32. Да, это большой PDF, но это также Библия для любого начинающего инженера. Помимо PDF, существует много меньших диссертаций, которые помогут обеспечить некоторые знания к клею, чтобы помочь понять детали вокруг таймеров. Все обычно доступные ссылки можно найти только с одним запросом Google.

Всем публикации на форуме... Подумай, прежде чем публиковать
Рассматривая эту ветку, OP делал то, что многие из нас время от времени делают; то есть опубликовано, а затем вернулся и удалил пост.
В этом случае несколько постов были удалены последовательно. Поток должен быть непрерывным по мышлению и ответу и удаляет, особенно несколько удалений, оставляет нить прерывистой и трудно следить за. Не делай этого... Если вам необходимо отредактировать предыдущий пост, то, по крайней мере, пробег так Старый или добавить ключ, чтобы читатель узнал, что текст был изменен, отредактирован, отредактирован, поправка и т. Д. Все несут ответственность за то, чтобы быть хорошим гражданином на форуме, так что подумайте, прежде чем публиковать публикацию.


Изображение



Луча
(Глобальный модератор)

Тед
Ср 28 февраля 2018 г., 19:52
Вот рисунок, разъясняющий мой вопрос - почему A не равен B .
fpistm - Спасибо за ваши предложения, это еще не работает, но это какой -то момент, чтобы начать.

Rogerclark
Чт, 01, 2018, 7:13 утра
Примечание.

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

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

fpistm
Чт, 01, 2018, 8:14
Это, вероятно, может быть новым предметом.
Как упоминал Рэй, я думаю, что вы должны прочитать лист данных и выполнить поиск об альтернативной функции.
http: // www.ул.com/content/ccc/resource/ ... 171190.PDF

См. §9 Общий назначение и я/ОС альтернативной функции (GPIOS и Afios)

Штифт GPIO может иметь несколько функций, но не одновременно. В соответствии с вами, чтобы настроить его в зависимости от вашей потребности. ПРОГРАММНОЕ ПРОГРАММНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ФУНКЦИИ
Чтобы оптимизировать количество функций периферического ввода -вывода для различных пакетов устройств, можно перебрать некоторые альтернативные функции в некоторые другие выводы. Это достигается программным обеспечением, программируя соответствующие регистры (см. В этом случае альтернативные функции больше не являются
Намечен на их первоначальные назначения

Тед
Чт, 01, 2018, 10:45 утра
Я совершил преступление, удаляющее свой собственный пост.

Тед
Вторник 27 марта 2018 г. 15:31
Пито
Можете ли вы помочь мне добавить вывод синусоидальной волны в свой код, возможно, комбинируя коды A и B ?
Код а HardwareTimer pwmtimer2(2); void setup() { pinMode(PA3, PWM); pwmtimer2.pause(); pwmtimer2.setPrescaleFactor(10); pwmtimer2.setOverflow(1000-1); pwmtimer2.setCompare(TIMER_CH4, 500); pwmtimer2.refresh(); pwmtimer2.resume(); }

victor_pv
Вторник 27 марта 2018 г., 17:42
[Тед - Ср 28 февраля 2018 г., 19:52] - Вот рисунок, разъясняющий мой вопрос - почему A не равен B .
fpistm - Спасибо за ваши предложения, это еще не работает, но это какой -то момент, чтобы начать.
Это альтернативные булавки. MCU позволяет вам, поэтому выберите, использует ли периферийный план один вывод или другой, но вы не можете использовать 2 контакта одновременно для той же функции. Это альтернативно, один или другой.
Все, что находится в справочном руководстве, это длинное, но вы должны прочитать через него, чтобы понять периферийные устройства. Никакая QA на форуме не будет рассмотрено, чему вас может научить справочное руководство.
Кроме того, вы не можете сделать синусоидальную волну с PWM. Время может выводить 0 или 1, низкий или высокий, но не аналогичный сигнал. Вам нужен ЦАП для этого, и у MCU нет DAC, так что нет синусоидальной волны.

Тед
Вторник 27 марта 2018 11:19
Мне не нужны ЦАП, ШИМ и фильтр

Bluepillf4 ПХБ

Бинарные часы