TIM3 так изначально и планировал. Все ж из двух оставшихся 16 битных таймеров сделал 32 битный - раз есть такая возможность - надо попробовать, упрощает ж все. Частотомер удался, только протеус в конце подкачал - на высоких частотах тормозит, не измеряет, на низких измеряет. В принципе протеусом что-то можно посимулировать, все остальное надо в железе (лучше сразу, как подсказали). Задаем частоту входную 1005Гц: Измеряем нашим частотомером: софтик: Спойлер
void InitTimers() { TIM3->ARR = 1000-1; //1000 TIM3->PSC = 8000-1; //8000000/8000 = 1000 TIM3->CR2 |= TIM_CR2_MMS_0; //Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is //useful to start several timers at the same time or to control a window in which a slave timer is //enabled. The Counter Enable signal is generated by a logic OR between CEN control bit //and the trigger input when configured in gated mode. //When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO, //except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR //register). TIM3->DIER |= TIM_DIER_UIE; // Update interrupt enabled TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_OPM; //Counter used as downcounter //Counter stops counting at the next update event (clearing the bit CEN) Counter enabled
TIM1->PSC = 0; TIM1->ARR = 0xFFFF; TIM1->SMCR |= TIM_SMCR_ETF_1; // External trigger filter //This bit-field then defines the frequency used to sample ETRP signal and the length of the //digital filter applied to ETRP. The digital filter is made of an event counter in which N //consecutive events are needed to validate a transition on the output: 0010: fSAMPLING=fCK_INT, N=4
TIM1->SMCR |= TIM_SMCR_ECE | TIM_SMCR_TS_1; //External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF //002: Internal Trigger 2 (ITR2) TIM3_TRGO
TIM1->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_2; //101: Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The //counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of //the counter are controlled.
TIM1->CR2 |= TIM_CR2_MMS_1; //010: Update - The update event is selected as trigger output (TRGO). For instance a master //timer can then be used as a prescaler for a slave timer. TIM1->CR1 |= TIM_CR1_CEN;
TIM2->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0; //111: External Clock Mode 1 - Rising edges of the selected trigger (TRGI) //clock the counter.
заняло: Program Size: Code=928 RO-data=268 RW-data=12 ZI-data=1044 з.ы. "велосипед" заново изобретен, теперь меня возьмут на работу на частотомеропроизводящую фабрику
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
for (int i = 10; i >= 0; i--) { buf[i] = '0' + val % 10; val /= 10; if (!val) return buf + i; } return 0; }
void InitTimers() { TIM3->ARR = 1000-1; //1000 TIM3->PSC = 8000-1; //8000000/8000 = 1000 TIM3->CR2 |= TIM_CR2_MMS_0; //Enable - the Counter enable signal, CNT_EN, is used as trigger output (TRGO). It is //useful to start several timers at the same time or to control a window in which a slave timer is //enabled. The Counter Enable signal is generated by a logic OR between CEN control bit //and the trigger input when configured in gated mode. //When the Counter Enable signal is controlled by the trigger input, there is a delay on TRGO, //except if the master/slave mode is selected (see the MSM bit description in TIMx_SMCR //register). TIM3->DIER |= TIM_DIER_UIE; // Update interrupt enabled TIM3->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_OPM; //Counter used as downcounter //Counter stops counting at the next update event (clearing the bit CEN) Counter enabled
TIM1->PSC = 0; TIM1->ARR = 0xFFFF; TIM1->SMCR |= TIM_SMCR_ETF_1; // External trigger filter //This bit-field then defines the frequency used to sample ETRP signal and the length of the //digital filter applied to ETRP. The digital filter is made of an event counter in which N //consecutive events are needed to validate a transition on the output: 0010: fSAMPLING=fCK_INT, N=4
TIM1->SMCR |= TIM_SMCR_ECE | TIM_SMCR_TS_1; //External clock mode 2 enabled. The counter is clocked by any active edge on the ETRF //002: Internal Trigger 2 (ITR2) TIM3_TRGO
TIM1->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_2; //101: Gated Mode - The counter clock is enabled when the trigger input (TRGI) is high. The //counter stops (but is not reset) as soon as the trigger becomes low. Both start and stop of //the counter are controlled.
TIM1->CR2 |= TIM_CR2_MMS_1; //010: Update - The update event is selected as trigger output (TRGO). For instance a master //timer can then be used as a prescaler for a slave timer. TIM1->CR1 |= TIM_CR1_CEN;
TIM2->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0; //111: External Clock Mode 1 - Rising edges of the selected trigger (TRGI) //clock the counter.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
ARV
Заголовок сообщения: Re: Мигать светодиодом. ARM или не-ARM?
пока отвлечемся от частотомеров Новый опорный дизайн электронного регулятора скорости для электродвигателей дронов от STMicroelectronics. Новый опорный дизайн STEVAL-ESC001V1 электронного регулятора скорости для дронов предназначен для коммерческих разработок дронов начального уровня и может управлять любым трех-фазным бесколлекторным(вентильным) двигателем при питании от 6-элементного (22.2В) LiPo аккумулятора или любого эквивалентного источника питания с пиковым током до 30 А. Спойлер Дизайн STEVAL-ESC001V1 базируется на высокоэффективных MOSFET транзисторах STL160NS3LLH7 с низким сопротивлением канала, высокопроизводительном микроконтроллере ARM® Cortex®-M4 STM32F303CBT7 и высоковольтных драйверах L6398.
Новый опорный дизайн позволяет быстро начать разработку и запустить электродвигатель благодаря микропрограммному пакету STSW-ESC001V1, реализующему бездатчиковый векторный (FOC) алгоритм управления с измерением фазных токов, управлением скоростью и полным активным торможением.
Опорный дизайн может принимать команды от блока управления полетом через ШИМ сигналы, UART, CAN или I²C.
Схема опорного дизайна имеет цепи защиты (датчик температуры, защита от перегрузки по току и напряжению) и может питать от основной батареи другие электронные системы дрона (5 В, 0.5 А).
Микропрограммный пакет STSW-ESC001V1 может быть дополнен программным пакетом разработки STSW-STM32100 для качественной и быстрой оптимизации параметров управления электродвигателем. Векторный алгоритм ST бездатчикового управления гарантирует длительное время полета и оптимальный динамические характеристики.
И что? Чипы отличаются только маркировкой и тем фактом, что дополнительная периферия скорее всего не тестировалась, но вероятность наткнуться на нерабочий таймер крайней мала, так что можно считать, что это полноценный F031.
Согласно RM может быть только 001 - One wait state. Т. е. 002 тоже поддерживается? У меня F030F4 стабильно работал на 96 МГц и при 1WS.
У меня в коде точно 2WS, но сначала я тоже думал, что можно максимум 1WS и, насколько помню, при разгоне были проблемы. Сейчас запустил с 1WS, светодиод на 96MHz моргает, но это другой камень, другое питание и совсем простая программа... А выставить можно и 7WS, причем именно столько и будет, проверить можно измеряя таймером время выполнения какого-то кода с разными настройками латентности.
В том, что это так, совсем не сложно убедиться любому желающему. Надо просто взять F030F4P6, создать в кубе проект для F031F6P6, заюзать периферию точно отсутствующую в F030 и наблюдать, как она работает, хоть в отладчике, хоть в реальном применении. И того, чем я реально пользовался, работают 32-битный таймер, PVD, бекап-регистры и 32к флеша.
Тестирование дешевой китайской отладочной платы для STM32. На плате припаян STM32F030F4P6 20 ног, ценой 0.50$ у китайцев если опт 50 шт., у нас в базарном лотке, не очень то в розницу и дороже. В STM32F030F4P6 по документации отсутствует 32 бит таймер. Но наш народ утверждает, что внутри такой же кристалл как и у STM32F031F6, а в нем есть 32 бит таймер, а еще флэша 32Кб, а не 16Кб и т.д.. Такой таймерок нам для частотомера пригодится - ну для любительского имхо можно использовать недокументированные возможности, а для профи не проблема - возьмем правильный кристалл. Разницу между кристаллами смотрим на странице продукта у самого ST (корявый перевод):
Цитата:
STM32F0x0 Value line имеет высокую конкурентоспособность на традиционных 8-битных и 16-разрядных рынках и устраняет необходимость управления различными архитектурами и связанными с ними расходами на разработку. Если вашему устройству требуется периферийное устройство USB, теперь можно заказать MCU линии линии STM32F070. Линия STM32F0x1 обеспечивает высокую интеграцию функций и охватывает широкий диапазон размеров и пакетов памяти, что обеспечивает гибкость для приложений, чувствительных к стоимости.
Будем, как всегда, согласно переименованной темы мигать светодиодом с помощью недокументированного таймера. Напишем софтик, где функция задержки сделана на таймере TIM2 (напомню для испытуемого STM32F030F4P6 по документации он 16 бит). Проект конечно же для STM32F031F6, но подсовываем в отладку STM32F030F4P6. На плате присутствует светодиод на PA4 не на землю, а на питание, поэтому вывод сделаем open-drain. Тактирование настраиваем от штатного кварца 8МГц, PLL умножаем на 6 - пока родные 48МГц, latency = 1. Таймер должен посчитать 48000000 тактов - это имхо не 16-ти битное число. Спойлер
Код:
#include "stm32f0xx.h"
void SystemInit(void) { RCC->CR |= RCC_CR_HSEON; /* Wait till HSE is ready */ while((RCC->CR & RCC_CR_HSERDY) != (RCC_CR_HSERDY)); RCC->CR &= ~(RCC_CR_HSION); // This is potentially a dangerous function as it could // result in a system with an invalid clock signal - result: a stuck system // Set the PLL up // First ensure PLL is disabled RCC->CR &= ~RCC_CR_PLLON; while ((RCC->CR & RCC_CR_PLLRDY)); // wait for PLL ready to be cleared // set PLL multiplier to 6 (yielding 48MHz) // Warning here: if system clock is greater than 24MHz then wait-state(s) need to be // inserted into Flash memory interface FLASH->ACR |= FLASH_ACR_LATENCY; // Turn on FLASH prefetch buffer FLASH->ACR |= FLASH_ACR_PRFTBE; RCC->CFGR &= ~(RCC_CFGR_PLLMUL_3 | RCC_CFGR_PLLMUL_2 | RCC_CFGR_PLLMUL_1 | RCC_CFGR_PLLMUL_0); RCC->CFGR |= (RCC_CFGR_SW_PLL | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL_2); // Need to limit ADC clock to below 14MHz so will change ADC prescaler to 4 RCC->CFGR |= RCC_CFGR_ADCPRE;
// Do the following to push HSI clock out on PA8 (MCO) // for measurement purposes. Should be 8MHz or thereabouts (verified with oscilloscope) /* RCC->CFGR |= (RCC_CFGR_MCO_2 | RCC_CFGR_MCO_0); RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER |= GPIO_MODER_MODER8_1; */
// and turn the PLL back on again RCC->CR |= RCC_CR_PLLON; // set PLL as system clock source RCC->CFGR |= RCC_CFGR_SW_1; }
void Delay1s() { TIM2->ARR = 48000000UL; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления TIM2->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR TIM2->CR1 |= TIM_CR1_CEN | TIM_CR1_OPM; //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM while ((TIM2->CR1 & TIM_CR1_CEN) != 0); }
int main(void) { // Power up PORTA, TIM2 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; GPIOA->MODER |= (GPIO_MODER_MODER4_0); // make bit PA4 an output GPIOA->OTYPER |= GPIO_OTYPER_OT_4; //Output open-drain
for (;;) { GPIOA->ODR ^= GPIO_ODR_4; // Toggle LED Delay1s(); // Wait 1s } }
Отладку производим с помощью китайского ST-link за 2.5$ это вам не Протеус (трудно понять, кто не пробовал) - на отладочной плате присутствует удобный разъем для подключения отладчика. Светодиод правильно (на глаз) мигает. О чудо - 16 бит таймер на самом деле 32 бит:
Сейчас этот форум просматривают: Кот Бегемотов и гости: 94
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения