STM32 - замена Arduino
Hold
Специалист
Томск
129 89
Отв.80 04 Мая 18, 18:27
В своем регуляторе сделал похоже. Аппаратный запуск таймера от zero-cross детектора, который отсчитывает нужную задержку открытия с разрешением 1 мкс, и по переполнению аппаратно запускает второй таймер, формирующий импульс на MOC3051. Можно и без второго таймера, но тогда надо каждый раз при изменении угла открытия пересчитывать ARR и CCRx регистры. Таймеры в режиме One Pulse Mode. А регулятор уже каждые 100 мс измеряет RMS мощность через ADE7953 и выбирает рассогласование с уставкой изменением угла открытия симистора. Есть еще что допилить, но сейчас держит +-2Вт на 2000 Вт нагрузки. Не совсем верно линейно менять угол, т.к. на разной нагрузке будут разные динамические характеристики регулятора Надо более точно калибрануть ADE7953, всё руки не доходят.
Z_h_e
Доцент
г. Чайковский
1.1K 313
Отв.81 04 Мая 18, 18:31, через 4 мин
Можно и без второго таймера, но тогда надо каждый раз при изменении угла открытия пересчитывать ARR и CCRx регистры.Hold, 04 Мая 18, 18:27Изначально я тоже на двух таймерах делал, но отказался. Считаю это избыток, имхо.
Hold
Специалист
Томск
129 89
Отв.82 04 Мая 18, 18:38, через 8 мин
У меня STM32F429 в 208-корпусе, на этапе схемы специально заложил выход MOC на пин, где висят выходы таймеров TIM2_CH4 и TIM5_CH4. А zero-cross приходит на TIM2_CH1. TIM5 можно slave-ом зацепить на TRGO TIM2. Таймеров хватает, решил чутка проц от излишних вычислений избавить. На входе TIM2 только фильтр чутка задал, т.к. на мощной нагрузке ФИУ нехило фонит, особенно на пике полуволны.
UPD: длина импульса на MOC3051M у меня всего 20 мкс при токе на диоде 15мА. На предыдущей странице указывали дикие длительности под 200 мкс - такие нужны при малых токах на излучающем диоде. Пробовал ставить 5 мкс - тоже работало, оставил 20 для уверенности. Ну и снимать надо за 200 мкс до нуля, это верно. У себя снимаю за 400 мкс маскимум, хотя всё равно на таких мелких мощностях не работаем.
UPD: длина импульса на MOC3051M у меня всего 20 мкс при токе на диоде 15мА. На предыдущей странице указывали дикие длительности под 200 мкс - такие нужны при малых токах на излучающем диоде. Пробовал ставить 5 мкс - тоже работало, оставил 20 для уверенности. Ну и снимать надо за 200 мкс до нуля, это верно. У себя снимаю за 400 мкс маскимум, хотя всё равно на таких мелких мощностях не работаем.
Sany531
Кандидат наук
Саяногорск
397 137
Отв.83 07 Мая 18, 05:44
Когда уже примеры регулятора пойдут для ф103 на одном таймере?
Hold
Специалист
Томск
129 89
Отв.84 07 Мая 18, 06:32, через 48 мин
Таймера General-Purpose не отличаются у семейств, настройки для F4 такие же для F1. Ну может чутка другие. Там строчек то...
К примеру для F4, куда уж проще, все настройки по RM. Но тут 2 таймера.
В итоге достаточно менять TIM2->ARR для изменения задержки открытия симистора, а далее таймера всё сделают аппаратно
К примеру для F4, куда уж проще, все настройки по RM. Но тут 2 таймера.
#define ADE_AC_SYNC_TIMER_CLK 1000000
#define ADE_AC_SYNC_PERIOD_US ((uint16_t)(RCC_Clocks.PCLK1_Frequency*2 / ADE_AC_SYNC_TIMER_CLK) - 1);
#define ADE_TRIAC_MAX_DELAY 9400 // Минимальная мощность
#define ADE_TRIAC_TIMER_CLK 15000000
#define ADE_TRIAC_TIMER_PERIOD 50000
// TIM2 master, input zero-cross
TIM2->CNT = 0;
TIM2->PSC = ADE_AC_SYNC_PERIOD_US;
TIM2->ARR = ADE_TRIAC_MAX_DELAY;
TIM2->CR1 = TIM_CR1_OPM | TIM_CR1_URS | TIM_CR1_ARPE;
TIM2->EGR = TIM_EGR_UG;
TIM2->CR2 = IM_CR2_MMS_1; // Update event as TRGO
TIM2->SMCR = TIM_SMCR_MSM | TIM_SMCR_TS_2 | TIM_SMCR_TS_0 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2; // TI1 input trigger
TIM2->CCMR1 = TIM_CCMR1_IC1F | TIM_CCMR1_CC1S_0; // CC1 channel is configured as input, IC1 is mapped on TI1.
// TIM5 slave, output triac
TIM5->CNT = 0;
TIM5->PSC = (uint16_t)(RCC_Clocks.PCLK1_Frequency*2 / ADE_TRIAC_TIMER_CLK) - 1;
TIM5->ARR = (ADE_TRIAC_TIMER_CLK /ADE_TRIAC_TIMER_PERIOD) - 1;
TIM5->CR1 = TIM_CR1_OPM | TIM_CR1_URS;
TIM5->EGR = TIM_EGR_UG;
TIM5->SMCR = TIM_SMCR_MSM | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2; // Trigger input from TIM2, trigger mode
TIM5->CCMR2 = TIM_CCMR2_OC4M_2; // Forced low
TIM5->CCER = TIM_CCER_CC4E; // CH4 output enable
TIM5->CCR4 = 1; //
В итоге достаточно менять TIM2->ARR для изменения задержки открытия симистора, а далее таймера всё сделают аппаратно
Mnz
Магистр
Город
254 86
Отв.85 07 Мая 18, 12:16
Когда уже примеры регулятора пойдут для ф103 на одном таймере?Sany531, 07 Мая 18, 05:44[сообщение #13293668]
[сообщение #13294237]
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.86 15 Июля 18, 18:36
по индусски сделал обмен с DS18b20 через USART1 и DMA измерение таки идет )))
Скрытый текст
uint16_t OW_DS18B20_GetTemp(uint8_t adrDSline) {
uint16_t ReturnTemp = 0;
uint8_t i;
uint8_t ow_presence;
// uint16_t dint;
spiDSadr dsadr ;
char tcomm_1[] = {0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00};//0xCC, 0x44
char tcomm_2[] = {0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//0xCC, 0xBE, 0xFF, 0xFF
char bufread[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//0xFF, 0xFF, 0xFF, 0xFF
dsadr.adrDS = adrDSline;
// dint = dsadr.byte595;
adrSPI = adrDS18; //сбросить бит на LOW - начало обмена, защелкнули входные данные в 589 - передача, 595 - прием
// SPI1->DR = dint; //загружаем данные для передачи, сигнал Е высокий
SPI1->DR = dsadr.byte595;
SPI1->CR1 |= SPI_CR1_SPE; //включаем SPI
while (!(SPI1->SR & SPI_SR_RXNE)); //ожидание окончания передачи
// dint = SPI1->DR; //прочитать принятые данные (опрос клавиатуры)
adrSPI = adrAT25; //установить бит, защелкнули выходные данные в 595->вывод HIGH, устанавливаем значения на выходах
SPI1->CR1 &= ~SPI_CR1_SPE; //выключаем SPI
//снижаем скорость
USART1->BRR = 0x1D4C; //Bodrate for 9600 on 72Mhz
USART1->SR &= ~USART_SR_TC;//сбрасываем флаг Transmission Complete
USART1->DR = 0xf0;
while (!(USART1->SR & USART_SR_TC)){}; //ожидание окончания передачи
ow_presence = USART1->DR;
//востанавливаем обычную скорость
USART1->BRR = 0x271; //Bodrate for 115200 on 72Mhz
if (ow_presence != 0xf0) {
//return OW_OK;
DMA1_Channel4->CCR &= ~DMA_CCR_EN;//выключаем канал DMA "usart1_tx" передача, для настройки
DMA1_Channel5->CCR &= ~DMA_CCR_EN;//выключаем канал DMA "usart1_rx" прием, для настройки
DMA1_Channel4->CCR |= DMA_CCR_DIR | DMA_CCR_MINC; //чтение из памяти, инкремент указателя в памяти
// DMA1_Channel5->CCR &= ~DMA_CCR_DIR //запись в память
DMA1_Channel5->CCR |= DMA_CCR_MINC; //инкремент указателя в памяти
DMA1_Channel4->CNDTR = (uint16_t) 16;//устанавливаем длину передаваемых данных DMA "usart1_tx"
DMA1_Channel5->CNDTR = (uint16_t) 16;//устанавливаем длину передаваемых данных DMA "usart1_rx"
DMA1_Channel4->CPAR = (uint32_t) &USART1->DR;//устанавливаем адрес приемник DMA "usart1_tx" передача
DMA1_Channel4->CMAR = (uint32_t) &tcomm_1[0];//устанавливаем адрес источник данных DMA "usart1_tx" передача
DMA1_Channel5->CPAR = (uint32_t) &USART1->DR;//устанавливаем адрес источник DMA "usart1_rx" прием
DMA1_Channel5->CMAR = (uint32_t) &bufread[0];//устанавливаем адрес приемник данных DMA "usart1_rx" прием
DMA1->IFCR = DMA_IFCR_CTCIF5; //Channel 5 Transfer Complete clear
DMA1_Channel4->CCR |= (DMA_CCR_EN| DMA_CCR_TCIE);// Channel enable usart1_tx, Transfer complete interrupt enable
DMA1_Channel5->CCR |= DMA_CCR_EN;// Channel enable usart1_rx
USART1->CR3 |= (USART_CR3_DMAT | USART_CR3_DMAR);//включаем DMA Enable Transmitter , DMA Enable Receive
USART1->CR1 |= USART_CR1_UE;
//==========как то некрасиво ожидание тут
// Ждем, пока не примем 8 байт ждем окончания передачи задания канала дма
while ( ! (DMA1->ISR & DMA_ISR_TCIF5) ) { };//Channel 5 Transfer Complete flag
//==========как то некрасиво ожидание тут
USART1->CR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR);//выключаем DMA Enable Transmitter , DMA Enable Receive
DMA1_Channel4->CCR &= ~(DMA_CCR_EN | DMA_CCR_TCIE);//Disable выключаем канал DMA "usart1_tx"
DMA1_Channel5->CCR &= ~DMA_CCR_EN;//Disable выключаем канал DMA "usart1_rx"
HAL_Delay(500);
USART1->BRR = 0x1D4C; //Bodrate for 9600 on 72Mhz
USART1->SR &= ~USART_SR_TC;//сбрасываем флаг Transmission Complete
USART1->DR = 0xf0;
while (!(USART1->SR & USART_SR_TC)){}; //ожидание окончания передачи
ow_presence = USART1->DR;
//востанавливаем обычную скорость
USART1->BRR = 0x271; //Bodrate for 115200 on 72Mhz
if (ow_presence != 0xf0) {
DMA1_Channel4->CNDTR = (uint16_t) 32;//устанавливаем длину передаваемых данных DMA "usart1_tx"
DMA1_Channel5->CNDTR = (uint16_t) 32;//устанавливаем длину передаваемых данных DMA "usart1_rx"
DMA1_Channel4->CPAR = (uint32_t) &USART1->DR;//устанавливаем адрес приемник DMA "usart1_tx" передача
DMA1_Channel4->CMAR = (uint32_t) &tcomm_2[0];//устанавливаем адрес источник данных DMA "usart1_tx" передача
DMA1_Channel5->CPAR = (uint32_t) &USART1->DR;//устанавливаем адрес источник DMA "usart1_rx" прием
DMA1_Channel5->CMAR = (uint32_t) &bufread[0];//устанавливаем адрес приемник данных DMA "usart1_rx" прием
DMA1->IFCR = DMA_IFCR_CTCIF5; //Channel 5 Transfer Complete clear
DMA1_Channel4->CCR |= (DMA_CCR_EN| DMA_CCR_TCIE);// Channel enable usart1_tx, Transfer complete interrupt enable
DMA1_Channel5->CCR |= DMA_CCR_EN;// Channel enable usart1_rx
USART1->CR3 |= (USART_CR3_DMAT | USART_CR3_DMAR);//включаем DMA Enable Transmitter , DMA Enable Receive
USART1->CR1 |= USART_CR1_UE;
//==========как то некрасиво ожидание тут
// Ждем, пока не примем 8 байт ждем окончания передачи задания канала дма
while ( ! (DMA1->ISR & DMA_ISR_TCIF5) ) { };//Channel 5 Transfer Complete flag
//==========как то некрасиво ожидание тут
USART1->CR3 &= ~(USART_CR3_DMAT | USART_CR3_DMAR);//выключаем DMA Enable Transmitter , DMA Enable Receive
DMA1_Channel4->CCR &= ~(DMA_CCR_EN | DMA_CCR_TCIE);//Disable выключаем канал DMA "usart1_tx"
DMA1_Channel5->CCR &= ~DMA_CCR_EN;//Disable выключаем канал DMA "usart1_rx"
for (i = 0; i < 16; i++) {
ReturnTemp = ReturnTemp >> 1;
if (*bufread == OW_R_1) {
ReturnTemp |= 0b1000000000000000;
}
}
return ReturnTemp;
}
}
return OW_NO_DEVICE;
}
Z_h_e
Доцент
г. Чайковский
1.1K 313
Отв.87 15 Июля 18, 18:39, через 3 мин
Попробуй тэг код использовать, а то в коде много ржущих морд
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.88 15 Июля 18, 18:44, через 5 мин
Z_h_e, пока галку не поставил "неиспользовать смайлы" от рожиц не избавился (веселенький код))))
Z_h_e
Доцент
г. Чайковский
1.1K 313
Отв.89 15 Июля 18, 18:46, через 2 мин
Думаю стоит модераторам обратить на это внимание, смайлы в коде не нужны.
Mnz
Магистр
Город
254 86
Отв.90 15 Июля 18, 23:04
Нужно использовать не тег pre, а code.
:) ;D ::) :-*
Hold
Специалист
Томск
129 89
Отв.91 16 Июля 18, 06:00
Код немного сыроват. Нет проверки что на линии вообще кто-то есть, нет обработки таймаута: если вдруг оборвется линия(или будем перетыкать разъем с датчиком), или DMA по какой-то помехе не примет 8 байт - навсегда повиснем в цикле while.
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.92 16 Июля 18, 08:42
Hold, код же индусский))) сделал в целях познания.
примеры из сети работать "сразу" не захотели. "железо" мною ещё изучается
пару вечеров убил пока не въехал в DMA1->IFCR = DMA_IFCR_CTCIF5; //Channel 5 Transfer Complete clear
примеры из сети работать "сразу" не захотели. "железо" мною ещё изучается
пару вечеров убил пока не въехал в DMA1->IFCR = DMA_IFCR_CTCIF5; //Channel 5 Transfer Complete clear
Mnz
Магистр
Город
254 86
Отв.93 16 Июля 18, 12:46
примеры из сети работать "сразу" не захотели.SedoY, 16 Июля 18, 08:42Эти рабочие. [сообщение #13275165]
[сообщение #13073672]
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.94 16 Июля 18, 20:20
Mnz, не то все это, не то.можт и работает. но не по мне все эти наглядные структуры и прочие плюшки.
и вот ещё ньюанс: датчики не заработали на ардуиновских библиотеках (ну чуть большее у них время измерения - брак в общем) а ведь никто не лазиет по ардуиновским библиотекам чтоб чтото поправить.
а тут я код пишу с нуля, попутно изучая матчасть, и интересно и познавательно и вникаю в нюансы постепенно.
Добавлено через 20дн. 23ч. 60мин.:
освоил создание схем и печаток, приятно удивлен прогрессу!
и вот ещё ньюанс: датчики не заработали на ардуиновских библиотеках (ну чуть большее у них время измерения - брак в общем) а ведь никто не лазиет по ардуиновским библиотекам чтоб чтото поправить.
а тут я код пишу с нуля, попутно изучая матчасть, и интересно и познавательно и вникаю в нюансы постепенно.
или DMA по какой-то помехе не примет 8 байт - навсегда повиснем в цикле whileHold, 16 Июля 18, 06:00там контроль на передачу, думал - не нашел ситуаций, когда дма не передаст заданное количество байт (а не примет), приусловии что не произошел крах кристала.
Добавлено через 20дн. 23ч. 60мин.:
освоил создание схем и печаток, приятно удивлен прогрессу!
sidorenko61
Новичок
Днепропетровск
2
Отв.95 21 Сент. 18, 12:35
как в программе EmBitz включить русский язык
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.96 21 Сент. 18, 12:39, через 4 мин
sidorenko61, нужно ли?
sidorenko61
Новичок
Днепропетровск
2
Отв.97 21 Сент. 18, 12:41, через 2 мин
Нужно
SedoY
Профессор
Новосибирск
5.1K 2.2K
Отв.98 21 Сент. 18, 12:50, через 9 мин
sidorenko61,
https://www.radiokot.ru/...64&start=60
https://tervel.livejournal.com/6468.html
попробуй
Скрытый текст
поиском вывалилось:https://www.radiokot.ru/...64&start=60
https://tervel.livejournal.com/6468.html
попробуй
Mnz
Магистр
Город
254 86
Отв.99 21 Сент. 18, 23:50
Архив нужно распаковать в папку C:\Program Files\EmBitz\share\EmBitz\
Дальнейшая инструкция в файле readme.txt архива.
Дальнейшая инструкция в файле readme.txt архива.