Подскажите пожалуйста, никак не могу разобраться.. Вот код установки частоты:
#include <Wire.h>
int del=1;
int f_g=2;
int imp=1;
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Включение светодиода
pinMode(PB0, PWM); // Выход генератора
Timer3.pause(); // Останавливаем таймер перед настройкой
Timer3.setPrescaleFactor(del); // Устанавливаем делитель
Timer3.setOverflow(f_g-1); // Устанавливаем переполнение, период
Timer3.setCompare(TIMER_CH3, imp); // Устанавливаем длину импульса
Timer3.refresh(); // Обнулить таймер
Timer3.resume(); // Запускаем таймер
}
void loop() {
}
По идее, он должен работать на контроллере с частотой 128MHz, и должен выдавать частоту 64MHz но контроллер при выборе данной частоты просто зависает после прошивки и перезагрузки.
Запускаю код на частоте 72MHz, работает, но выход частоты составляет всего 3735 kHz.
Странное число. 72 / 2 / 2 = 18 МГц должно быть. Если бы del = 0 , то 72 / 2 = 36 МГц. 3.735МГц * 4 = 14.94 МГц тактирование таймера. Не понятная величина. Я б вывел такт ядра/2 на РА8 RRC-MCO что бы знать такт ядра, должно быть 36МГЦ, но как это сделать в командах этого аддона не знаю, не разбирался, а так выставть ногу на выход и выставить бит SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
Я б вывел такт ядра/2 на РА8 RRC-MCO что бы знать такт ядра, должно быть 36МГЦ, но как это сделать в командах этого аддона не знаю, не разбирался, а так выставть ногу на выход и выставить бит SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
- Может сможете подсказать какой-то другой код, чтоб только проверить на
какой частоте работает контроллер?
"Он" - это кто? У вас и "загружает" и "запускает" одна и та же программа - тот HID-бутлоадер. что вы залили в плату. Так что он по какому адресу прошивку положил, по тому и запускает.
А что этот адрес меньше, чем у другого бута - так это совершенно нормально, размеры бутов разные вот и все
Думаю, это вы считаете, что вопрос элементарный, а он таковым не является. И это проблема Ардуино иде.
ну, во-первых, это не проблема Ардуино ИДЕ. ИДЕ не имеет ни малейшего отношения ни к драйверам ( их пишет производитель чипов - компания ST) , ни к вашему загрузчику.
Ну а далее - уже то, что у вас драйвера не встали (или вы не сумели) - довольно подозрительно. Вообще у большинства пользователей нет проблем с драйверами на Вин10. Зато есть случаи, когда фирменные драйвера не подходят - и чаще всего это говорит. что чипы поддельные или не вполне рабочие. Особенно много клонов СТМ32 появилось на Али в последние полгода.
Кстати. было бы неплохо, если б вы выложили ссылку на лот, где покупали платы и на их фото в хорошем качестве с двух сторон
И даже перемычка была не распаяна к ноге чипа, что нельзя
было переключить в BOOT0 режим.. Замкнув ногу, контроллер
перевел в режим загрузки, и залил прошивку через UART..
После загрузки прошивки, подключил контроллер через его USB,
сначала устройство нашлось, но без номера порта, потом выдергивания,
и / или перезагрузка решили вопрос, устройство все-таки опозналось
как COM порт, и после этого Arduino IDE смог снюхаться с платой..
Но если честно, мне не нравиться работа Arduino IDE через
встроенный USB порт платы, как-то криво работает..
Поэтому удалил этот загрузчик и работаю с платой через ST-Link..
Нужно знать, с какого адреса он будет грузить вашу программу. В конфигурации программы, своей, указать такой же адрес. Не знаю как там у вас в ардуине это делается.
Например, в бутлоадере указано, что он начнёт грузить с 0x08001000, значит ваша программа при линковке должна иметь стартовый адрес 0x08001000.
Привет всем. Вот уже месяц как как юзаюSTM32F103. может кому поможет. Как программист я не очень и задачи у меня утилитарные(включить-выкл, математические вычисления, дисплей,генераторы меандра звуковых частот,( из за этого и пересел на STM, что бы была возможность точно воспроизводить аккорды, у ардуино не хватает точности воспроизведения особенно низких частот. Конечно это мой косяк как программиста. поэтому решаю свои проблемы так как понимаю) но пост не об этом!!!
По работе много работаю с FBD. открыл FB Prog, все то же самое. Выбираю контроллер NANO, делаю свои примитивные алгоритмы или блоками , или лестницей. послев настройках ставлю "открывать IDE при компиляции" и копирую готовый скетч в свой IDE. А там элементарно допиливаю нумерацию и адресацию пинов, составляю несколько скечей вместе,если нужно. Я конечно только в начале пути, но пока все что попробовал заработало на STM сразу. Язык русский, библиотеки шин IIC и SPI работают(у меня по крайней мере).
( из за этого и пересел на STM, что бы была возможность точно воспроизводить аккорды, у ардуино не хватает точности воспроизведения особенно низких частот.
Это как?
Элементарная арифметика показывает, что чем ниже частота, тем точнее ее можно воспроизвести.
Всё как должно быть. Если нужен ШИМ, то переполнение должно быть больше импульса. Собственно частота при ШИМ это частота тактирования делённая на глубину ШИМ. Если нужен, скажем, ШИМ на 1000 точек, то выходная частота будет 36кГц.
Andrey_Ak, изучать принципы работы таймеров посредством ардуиновских функций -дело заведомо гиблое. Функция делителя -делить тактовую таймера. На частоту он влияет конечно, но непосредственно управляет частотой регистр переполнения ARR, в данном случае функция setOverflow, значение там всегда должно быть >= регистра сравнения. Например для 50-% заполнения там должно быть число 100, если в сравнение записано 50.
Andrey_Ak, ну например в моём генераторе это реализовано таким образом, что свыше ~8 кГц энкодер подстраивает уже не частоту, а регистр ARR, таким образом "холостого хода" у энкодера нет.
не могу решить задачу плавной регулировки + - частоты.
Андрей, еще в самом начале, когда вы только спрашивали как сделать генератор на СТМ - я вам писал. что настраивать частоту в районе 1 МГц с точностью в герц и даже в килогерц невозможно. Так чему ж вы удивляетесь? 1 МГц и 1.014 МГц - это разница между прескалером 72 и 71, меньше быть не может
Андрей, еще в самом начале, когда вы только спрашивали как сделать генератор на СТМ - я вам писал. что настраивать частоту в районе 1 МГц с точностью в герц и даже в килогерц невозможно. Так чему ж вы удивляетесь? 1 МГц и 1.014 МГц - это разница между прескалером 72 и 73, меньше быть не может
Я это понимаю, проблема сделать один щелчек энкодера - частота 1.000, еще один щелчек - частота 1.014 и т.д.. А у меня десять-сто-тысяча щелчков надо сделать...
И еще. Первое, что вам надо было сделать, прежде чем браться за код - это понять, что означают каждый из регистров таймера. Судя по коду в #826 для вас это темный лес. вы их подбираете методом тыка.
А вы, вместо того чтоб разобрать, в общем, элементарнывй код - зачем-то бросились искать другой, в котором так же нихрена не понимаете. Поймите, не поняв принципов работы таймеров в СТМ - вы не напишете генератор.
Да, не понимаю... Ну никак, сложно все.. Поэтому беру готовый кусок и пытаюсь разобраться как его приспособить.. Прошлую версию генератора на Mega328 под себя написал как хотел.. Хоть и остался непонятным кусок кода с установкой таймера..
А что касается кода в #826, так он самый понятный, и переменные вроде понятны, какая что делает, не понимаю как увязать все три переменные, когда они друг на друга влияют...
А что касается кода в #826, так он самый понятный, и переменные вроде понятны, какая что делает, не понимаю как увязать все три переменные, когда они друг на друга влияют...
простите, но это называется "нихрена не понимаю" :)
очень распространенная ситуация в практике начинающих переводчиков - каждое слово в предложении перевел, а смысла фразы так и не понял. Тут путь один - прокачиваться дальше. у большинства слов не одно и не два значения в словарике, а десятки...
вот и у вас так же - похоже вам только кажется. что вы поняли каждую переменную
С таймером всё очень просто. Есть два делителя тактовой частоты таймера. Предделитель, который делит входную тактовую 72МГц и собственно счётчик таймера. Т.Е. частота делится 2 раза в подряд. Соответственно устанавливая в два регистра (Ваши del - предделитель и f_g - максимальный счётчик) любые числа можно исходную частоту поделить на нужную величину. Для понимания возможностей можно например в экселе рассчитать конечную частоту для всех целых чисел, поделив 72000000 на все числа от 1 до 2^32. Третий Ваш регистр - imp это регистр сравнения. В момент, когда imp= счётчику в выбранном Вами режиме происходит переброс выходной ноги. Обратно нога сбрасывается, когда счетчик достигает f_g. Поэтому, что бы получить меандр на выходе imp должен быть равен половине f_g. Есть режим, где нога перебрасывается только в момент когда imp= счётчику, на выходе всегда получается меандр, но частота его в 2 раза ниже, т.к. для полного цикла счетчик должен пробежать 2 раза. В этом режиме imp можно присвоить 1 и про него забыть.
Вообще режимов работы таймера множество. Все они базируются на трёх китах - предделитель, счётчик, регистры сравнения. Остальное обвязка для соединения этих регистров и входных - выходных ног в желаемую конфигурацию. Возможен почти любой каприз.
Вот энкодером не понял. У меня энкодеры висят на двух входных ногах таймера, находящегося в режиме чтения энкодера. На каждый клик энкодера прилетает прерывание таймера, в котором выдается направление клика. Соответственно выставляю флаг клика и в loop делаю один шаг по частоте. Всё работает без задержек.
- Вот тут понятно, частоту 9008 генератор не может дать,
и дает следующую возможною, а именно 9009, хорошо, пусть так..
А теперь обратная ситуация, мы идем на уменьшение:
9010 --> 9010Hz Duty=50
9009 --> 9009Hz Duty=50
9008 --> 9009Hz Duty=50
9008 --> 9009Hz Duty=50
- И происходит затык, после значения 9009 мне нужно уменьшить
частоту генератора на возможную, но при вводе 9008 он дает
возможную следующую частоту, но в большую сторону, а мне
нужно в меньшую.
Как подправить этот код, чтоб он давал возможные частоты,
но на уменьшение???
Так-бы я представленный код выше использовал для увеличения
частот, а подправленный код использовал для уменьшения частот..
Ну этот кусок кода вывода частоты был готовый.. Я его мало понимаю...
я вам наверно уже раза три сказал. что сначала надо разобраться, как это работает, а потом генераторы писать. Там математика на уровне школьной программы, академиком для этого быть не надо.
Что касается строчки с while() - у вас переменные freq и divider обьявлены как int, значит и результат может быть только int ... еще и знаковый...
Хотя нет, это же STM32 - там int 4 байта. Возражение снимается
Да, если видете в коде слово int, надо быть очень внимательным. Желательно от них вообще оказаться, заменять на short или long для того, если кто-то решит перенести код на другую платформу, чтобы не было проблем потом.
Коллеги, подскажите, в аддоне Кларка обновление регистра ARR функцией Timer.setOverflow(x) идет через Прелоад или непосредственно в регистр? что по исходнику понять не могу
Да, если видете в коде слово int, надо быть очень внимательным. Желательно от них вообще оказаться, заменять на short или long для того, если кто-то решит перенести код на другую платформу, чтобы не было проблем потом.
есть прекрасные, самоговорящие за себя имена типов, int8_t, uint32_t, даже int64_t есть, и как вишенка на торте AVR GCC - __int24. Используй их, люк, и волосы будут мяхкими и шелковистыми.
Подскажите пожалуйста, никак не могу разобраться.. Вот код установки частоты:
По идее, он должен работать на контроллере с частотой 128MHz, и должен выдавать частоту 64MHz но контроллер при выборе данной частоты просто зависает после прошивки и перезагрузки.
Запускаю код на частоте 72MHz, работает, но выход частоты составляет всего 3735 kHz.
Информацию по коду изучал в этой статье: https://istarik.ru/blog/arduino/105.html
Странное число. 72 / 2 / 2 = 18 МГц должно быть. Если бы del = 0 , то 72 / 2 = 36 МГц. 3.735МГц * 4 = 14.94 МГц тактирование таймера. Не понятная величина. Я б вывел такт ядра/2 на РА8 RRC-MCO что бы знать такт ядра, должно быть 36МГЦ, но как это сделать в командах этого аддона не знаю, не разбирался, а так выставть ногу на выход и выставить бит SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
Andrey_Ak, в скетче ошибок нет. Наиболее вероятно, что мк поддельный. На помойку его..
Andrey_Ak, в скетче ошибок нет. Наиболее вероятно, что мк поддельный. На помойку его..
Спасибо, будем ждать когда другие, вроде оригинальные приедут..
Возможно из-за этого и не работает на 128МГц
Или может быть проблема в библиотеке Wire.h - может для STM32 нужна другая версия?
А Вы не могли-бы, дать такой-же простой код, только для генерации частоты и скважности,
но по вашему варианту кода отсюда:
http://arduino.ru/forum/proekty/generator-s-reguliruemoei-chastotoi-na-arduino#comment-395540
Я б вывел такт ядра/2 на РА8 RRC-MCO что бы знать такт ядра, должно быть 36МГЦ, но как это сделать в командах этого аддона не знаю, не разбирался, а так выставть ногу на выход и выставить бит SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
- Может сможете подсказать какой-то другой код, чтоб только проверить на
какой частоте работает контроллер?
Andrey_Ak , там есть простой код, #27
- Может сможете подсказать какой-то другой код, чтоб только проверить на
какой частоте работает контроллер?
pinMode(PA8, PWM);
RCC_BASE->CFGR &= ~(0xf << 24);
RCC_BASE->CFGR |= 1 << 26 ; //вывод системной частоты на А8
PS: Свыше 50МГц амплитуда сильно падает...
"Такой личный неприязнь испытывал к " этой Ардуине , но купился на простоту. Хотя простота, иногда , хуже...
Хотел сделать загрузку по юсб, но долгие "танцы с бубном" ни к чему не привели. :( Драйверы на Вин10 не ставятся.
Подумал, а нафига они? Нашелся https://github.com/Serasidis/STM32_HID_Bootloader .
Залил. Залился. Заливает. Но проблема, блинк не блинкает. :(
Как я думаю , загрузка не по тому адресу: нужно 0x8001000, а грузит в 0x8000800.
Может кто-нибудь уже ходил по этим граблям, и что-то посоветует.
Хотел сделать загрузку по юсб, но долгие "танцы с бубном" ни к чему не привели. :( Драйверы на Вин10 не ставятся.
какие драйверы то? сначала загрузчик в плату надо залить через UART -переходник.
Либо, самое простое - прошивать через программатор, Ст-линк например
какие драйверы то? сначала загрузчик в плату надо залить через UART -переходник.
А как вы думаете я заливал хид-загрузчик?
И я не спрашиваю, про самое простое, я спрашиваю про юсб.
И я не спрашиваю, про самое простое, я спрашиваю про юсб.
так и я вам говорю про ЮСБ-загрузчик...
ну как знаете.
Либо, самое простое - прошивать через программатор, Ст-линк например
И где тут про юсб?
Как я думаю , загрузка не по тому адресу: нужно 0x8001000, а грузит в 0x8000800.
это не имеет значения
Как я думаю , загрузка не по тому адресу: нужно 0x8001000, а грузит в 0x8000800.
это не имеет значения
С чего вы так решили?
Думаю, он запускает с 1000, а стартовый 800.
С чего вы так решили?
Думаю, он запускает с 1000, а стартовый 800.
"Он" - это кто? У вас и "загружает" и "запускает" одна и та же программа - тот HID-бутлоадер. что вы залили в плату. Так что он по какому адресу прошивку положил, по тому и запускает.
А что этот адрес меньше, чем у другого бута - так это совершенно нормально, размеры бутов разные вот и все
Так что он по какому адресу прошивку положил, по тому и запускает.
Это вы так считаете.
А по ссылке , автор утверждает, что " user FLASH begins and the interrupt vector resides (0x8001000)."
Это вы так считаете.
А по ссылке , автор утверждает, что " user FLASH begins and the interrupt vector resides (0x8001000)."
ну то есть автор намеренно грузит код по неправильному адресу? :) зачем вы такой бутлоадер взяли?
Уважаемый, а может поменьше пафоса? Если вы так уверены в своих знаниях, странно что вы пришли на форум задавать элементарные вопросы.
ну то есть автор намеренно грузит код по неправильному адресу? :) зачем вы такой бутлоадер взяли?
Уважаемый, а может поменьше пафоса? Если вы так уверены в своих знаниях, странно что вы пришли на форум задавать элементарные вопросы.
Думаю, это вы считаете, что вопрос элементарный, а он таковым не является. И это проблема Ардуино иде.
Бутлодер такой взял, потому что ему не нужна установка драйверов.
Надеюсь, что здесь есть люди , способные не только, как вы, давать советы "космической глупости". :)
Думаю, это вы считаете, что вопрос элементарный, а он таковым не является. И это проблема Ардуино иде.
ну, во-первых, это не проблема Ардуино ИДЕ. ИДЕ не имеет ни малейшего отношения ни к драйверам ( их пишет производитель чипов - компания ST) , ни к вашему загрузчику.
Ну а далее - уже то, что у вас драйвера не встали (или вы не сумели) - довольно подозрительно. Вообще у большинства пользователей нет проблем с драйверами на Вин10. Зато есть случаи, когда фирменные драйвера не подходят - и чаще всего это говорит. что чипы поддельные или не вполне рабочие. Особенно много клонов СТМ32 появилось на Али в последние полгода.
Кстати. было бы неплохо, если б вы выложили ссылку на лот, где покупали платы и на их фото в хорошем качестве с двух сторон
У меня явно фейковый контроллер:
http://arduino.ru/forum/programmirovanie/stm32-f103c8t6?page=15#comment-...
И даже перемычка была не распаяна к ноге чипа, что нельзя
было переключить в BOOT0 режим.. Замкнув ногу, контроллер
перевел в режим загрузки, и залил прошивку через UART..
После загрузки прошивки, подключил контроллер через его USB,
сначала устройство нашлось, но без номера порта, потом выдергивания,
и / или перезагрузка решили вопрос, устройство все-таки опозналось
как COM порт, и после этого Arduino IDE смог снюхаться с платой..
Но если честно, мне не нравиться работа Arduino IDE через
встроенный USB порт платы, как-то криво работает..
Поэтому удалил этот загрузчик и работаю с платой через ST-Link..
ИДЕ не имеет ни малейшего отношения ни к драйверам ( их пишет производитель чипов - компания ST) , ни к вашему загрузчику.
К драйверам да( ST, думаю тоже), а к загрузчику очень даже. Она должна же знать адрес загрузки. чтобы компилировать под него.
В boards.txt я нашел строчку:
"genericSTM32F103C.menu.upload_method.HIDUploadMethod.build.vect=VECT_TAB_ADDR=0x8001000"
Так что грузить должен правильно.
Нужно знать, с какого адреса он будет грузить вашу программу. В конфигурации программы, своей, указать такой же адрес. Не знаю как там у вас в ардуине это делается.
Например, в бутлоадере указано, что он начнёт грузить с 0x08001000, значит ваша программа при линковке должна иметь стартовый адрес 0x08001000.
Привет всем. Вот уже месяц как как юзаюSTM32F103. может кому поможет. Как программист я не очень и задачи у меня утилитарные(включить-выкл, математические вычисления, дисплей,генераторы меандра звуковых частот,( из за этого и пересел на STM, что бы была возможность точно воспроизводить аккорды, у ардуино не хватает точности воспроизведения особенно низких частот. Конечно это мой косяк как программиста. поэтому решаю свои проблемы так как понимаю) но пост не об этом!!!
По работе много работаю с FBD. открыл FB Prog, все то же самое. Выбираю контроллер NANO, делаю свои примитивные алгоритмы или блоками , или лестницей. послев настройках ставлю "открывать IDE при компиляции" и копирую готовый скетч в свой IDE. А там элементарно допиливаю нумерацию и адресацию пинов, составляю несколько скечей вместе,если нужно. Я конечно только в начале пути, но пока все что попробовал заработало на STM сразу. Язык русский, библиотеки шин IIC и SPI работают(у меня по крайней мере).
Пожалуй все, рад если кому поможет.
Не знаю как там у вас в ардуине это делается.
Вот и я не знаю. :)
Короче, блинк-за блинкал. Надеюсь, загрузилось куда надо.
И дело было в Ардуине... , ну почти. :) Требовалось это :
https://github.com/stm32duino/Arduino_Core_STM32 , а было Arduino_STM32. После чего появился HIDbootloader 2.2(был 2.0)
Так что кому хочется загружаться без драйверов, можно пробовать.
( из за этого и пересел на STM, что бы была возможность точно воспроизводить аккорды, у ардуино не хватает точности воспроизведения особенно низких частот.
Элементарная арифметика показывает, что чем ниже частота, тем точнее ее можно воспроизвести.
Извините, тест.
Помогите пожалуйста разобраться с ШИМ на разных частотах,
никак не могу понять как сделать..
Вот скетч генератора:
Частота задается делителем, переменной "del",
при del=1, частота 36 МГц,
при del=65535, частота 549 Гц
Всё как должно быть. Если нужен ШИМ, то переполнение должно быть больше импульса. Собственно частота при ШИМ это частота тактирования делённая на глубину ШИМ. Если нужен, скажем, ШИМ на 1000 точек, то выходная частота будет 36кГц.
Andrey_Ak, изучать принципы работы таймеров посредством ардуиновских функций -дело заведомо гиблое. Функция делителя -делить тактовую таймера. На частоту он влияет конечно, но непосредственно управляет частотой регистр переполнения ARR, в данном случае функция setOverflow, значение там всегда должно быть >= регистра сравнения. Например для 50-% заполнения там должно быть число 100, если в сравнение записано 50.
Пытаюсь использовать другой код вывода частоты,
не могу решить задачу плавной регулировки + - частоты.
Код установки частоты принимает значение f и под
него подстраивает частоту..
Увеличиваю значение f энкодером:
RIGHT enc1-- f: 999991 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999992 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999993 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999994 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999995 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999996 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999997 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999998 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 999999 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 1000000 freq: 1000000Hz Duty=50
RIGHT enc1-- f: 1000001 freq: 1014084Hz Duty=49
RIGHT enc1-- f: 1000002 freq: 1014084Hz Duty=49
RIGHT enc1-- f: 1000003 freq: 1014084Hz Duty=49
RIGHT enc1-- f: 1000004 freq: 1014084Hz Duty=49
И для следующего шага частоты от 1.000МГц до 1.014
нужно много крутить энкодер..
И назад тоже:
LEFT enc1-- f: 1000004 freq: 1014084Hz Duty=49
LEFT enc1-- f: 1000003 freq: 1014084Hz Duty=49
LEFT enc1-- f: 1000002 freq: 1014084Hz Duty=49
LEFT enc1-- f: 1000001 freq: 1014084Hz Duty=49
LEFT enc1-- f: 1000000 freq: 1000000Hz Duty=50
LEFT enc1-- f: 999999 freq: 1000000Hz Duty=50
Не получается сообразить как реализовать нормально..
Что-то типа проверки.. Блин, даже объяснить сложно...
Нужно придумать какое-то хитрое условие, например после установки частоты,
чтоб f сама увеличивалась/уменьшалась пока не измениться частота freq..
Типа цикл, увеличивать f пока freq не измениться..
Ну никак не могу сообразить... :(
не могу решить задачу плавной регулировки + - частоты.
Андрей, еще в самом начале, когда вы только спрашивали как сделать генератор на СТМ - я вам писал. что настраивать частоту в районе 1 МГц с точностью в герц и даже в килогерц невозможно. Так чему ж вы удивляетесь? 1 МГц и 1.014 МГц - это разница между прескалером 72 и 71, меньше быть не может
Андрей, еще в самом начале, когда вы только спрашивали как сделать генератор на СТМ - я вам писал. что настраивать частоту в районе 1 МГц с точностью в герц и даже в килогерц невозможно. Так чему ж вы удивляетесь? 1 МГц и 1.014 МГц - это разница между прескалером 72 и 73, меньше быть не может
Я это понимаю, проблема сделать один щелчек энкодера - частота 1.000, еще один щелчек - частота 1.014 и т.д.. А у меня десять-сто-тысяча щелчков надо сделать...
Пытаюсь использовать другой код вывода частоты,
И еще. Первое, что вам надо было сделать, прежде чем браться за код - это понять, что означают каждый из регистров таймера. Судя по коду в #826 для вас это темный лес. вы их подбираете методом тыка.
А вы, вместо того чтоб разобрать, в общем, элементарнывй код - зачем-то бросились искать другой, в котором так же нихрена не понимаете. Поймите, не поняв принципов работы таймеров в СТМ - вы не напишете генератор.
Да, не понимаю... Ну никак, сложно все.. Поэтому беру готовый кусок и пытаюсь разобраться как его приспособить.. Прошлую версию генератора на Mega328 под себя написал как хотел.. Хоть и остался непонятным кусок кода с установкой таймера..
А что касается кода в #826, так он самый понятный, и переменные вроде понятны, какая что делает, не понимаю как увязать все три переменные, когда они друг на друга влияют...
А что касается кода в #826, так он самый понятный, и переменные вроде понятны, какая что делает, не понимаю как увязать все три переменные, когда они друг на друга влияют...
простите, но это называется "нихрена не понимаю" :)
очень распространенная ситуация в практике начинающих переводчиков - каждое слово в предложении перевел, а смысла фразы так и не понял. Тут путь один - прокачиваться дальше. у большинства слов не одно и не два значения в словарике, а десятки...
вот и у вас так же - похоже вам только кажется. что вы поняли каждую переменную
С таймером всё очень просто. Есть два делителя тактовой частоты таймера. Предделитель, который делит входную тактовую 72МГц и собственно счётчик таймера. Т.Е. частота делится 2 раза в подряд. Соответственно устанавливая в два регистра (Ваши del - предделитель и f_g - максимальный счётчик) любые числа можно исходную частоту поделить на нужную величину. Для понимания возможностей можно например в экселе рассчитать конечную частоту для всех целых чисел, поделив 72000000 на все числа от 1 до 2^32. Третий Ваш регистр - imp это регистр сравнения. В момент, когда imp= счётчику в выбранном Вами режиме происходит переброс выходной ноги. Обратно нога сбрасывается, когда счетчик достигает f_g. Поэтому, что бы получить меандр на выходе imp должен быть равен половине f_g. Есть режим, где нога перебрасывается только в момент когда imp= счётчику, на выходе всегда получается меандр, но частота его в 2 раза ниже, т.к. для полного цикла счетчик должен пробежать 2 раза. В этом режиме imp можно присвоить 1 и про него забыть.
Вообще режимов работы таймера множество. Все они базируются на трёх китах - предделитель, счётчик, регистры сравнения. Остальное обвязка для соединения этих регистров и входных - выходных ног в желаемую конфигурацию. Возможен почти любой каприз.
Вот энкодером не понял. У меня энкодеры висят на двух входных ногах таймера, находящегося в режиме чтения энкодера. На каждый клик энкодера прилетает прерывание таймера, в котором выдается направление клика. Соответственно выставляю флаг клика и в loop делаю один шаг по частоте. Всё работает без задержек.
Подскажите пожалуйста, никак не могу разобраться, вот код:
"Терминал принимает два числа через пробел. Частоту и дьюти в процентах.
Если дьюти не задать, то он по умолчанию 50%"
Взят отсюда:
http://arduino.ru/forum/proekty/generator-s-reguliruemoei-chastotoi-na-a...
Cообщение #27
---
Вводим в терминале значения частоты:
9000 --> 9000Hz Duty=50
9001 --> 9001Hz Duty=50
9002 --> 9002Hz Duty=50
9003 --> 9003Hz Duty=50
9004 --> 9004Hz Duty=50
9005 --> 9005Hz Duty=50
9006 --> 9006Hz Duty=50
9007 --> 9007Hz Duty=50
9008 --> 9009Hz Duty=50
- Вот тут понятно, частоту 9008 генератор не может дать,
и дает следующую возможною, а именно 9009, хорошо, пусть так..
А теперь обратная ситуация, мы идем на уменьшение:
9010 --> 9010Hz Duty=50
9009 --> 9009Hz Duty=50
9008 --> 9009Hz Duty=50
9008 --> 9009Hz Duty=50
- И происходит затык, после значения 9009 мне нужно уменьшить
частоту генератора на возможную, но при вводе 9008 он дает
возможную следующую частоту, но в большую сторону, а мне
нужно в меньшую.
Как подправить этот код, чтоб он давал возможные частоты,
но на уменьшение???
Так-бы я представленный код выше использовал для увеличения
частот, а подправленный код использовал для уменьшения частот..
Вообщем решил проблему, возможно конечно не грамотно, но работает как надо:
Список всех возможных частот начиная от 100кГц:
http://tis.kz/temp/arduino/2st.gen.II.txt
Максимальную частоту ограничил 4MHz, больше там уже только подобие сигнала...
И список частот от 100кГц в сравнении с генератором на ATMEGA328A:
http://tis.kz/temp/arduino/freq_16_72.xls
Андрей, сначала меня смутила вот эта фраза
Максимальную частоту ограничил 4MHz, больше там уже только подобие сигнала...
цифровой генератор он тем и характерен, что без проблем должен выдавать любую частоту вплоть до максимальной
Но когда я увмдел вот это в коде
я удивляться перестал
Выражение в скобкаж while() никогда не превысит 65536. поэтому вся эта конструкция бесполезна в принципе
Ну этот кусок кода вывода частоты был готовый.. Я его мало понимаю...
Ну этот кусок кода вывода частоты был готовый.. Я его мало понимаю...
я вам наверно уже раза три сказал. что сначала надо разобраться, как это работает, а потом генераторы писать. Там математика на уровне школьной программы, академиком для этого быть не надо.
Что касается строчки с while() - у вас переменные freq и divider обьявлены как int, значит и результат может быть только int ... еще и знаковый...
Хотя нет, это же STM32 - там int 4 байта. Возражение снимается
Да, если видете в коде слово int, надо быть очень внимательным. Желательно от них вообще оказаться, заменять на short или long для того, если кто-то решит перенести код на другую платформу, чтобы не было проблем потом.
Коллеги, подскажите, в аддоне Кларка обновление регистра ARR функцией Timer.setOverflow(x) идет через Прелоад или непосредственно в регистр? что по исходнику понять не могу
есть прекрасные, самоговорящие за себя имена типов, int8_t, uint32_t, даже int64_t есть, и как вишенка на торте AVR GCC - __int24. Используй их, люк, и волосы будут мяхкими и шелковистыми.
простой генератор с регулировкой частоты
хреновенький такой генератор, Геня. Зачем дергать таймер и дисплей на каждом проходе loop() -обращайтесь к ним только в случае изменения периода
Подскажите, а куда в этой плате подключать источник опорного напряжения для АЦП?
На блюпиле Aref не выведены на пины.
Скорей всего как я понял это 9 пин микроконтроллера, он по умолчанию припаян к +3,3 вольта.