Форум самогонщиков Сайт Барахолка Сделать добро

STM32 - замена Arduino

Форум Оборудование Автоматика
1 2 3 4 5 6 5
Hold Специалист Томск 129 88
Отв.80  04 Мая 18, 18:27
В своем регуляторе сделал похоже. Аппаратный запуск таймера от zero-cross детектора, который отсчитывает нужную задержку открытия с разрешением 1 мкс, и по переполнению аппаратно запускает второй таймер, формирующий импульс на MOC3051. Можно и без второго таймера, но тогда надо каждый раз при изменении угла открытия пересчитывать ARR и CCRx регистры. Таймеры в режиме One Pulse Mode. А регулятор уже каждые 100 мс измеряет RMS мощность через ADE7953 и выбирает рассогласование с уставкой изменением угла открытия симистора. Есть еще что допилить, но сейчас держит +-2Вт на 2000 Вт нагрузки. Не совсем верно линейно менять угол, т.к. на разной нагрузке будут разные динамические характеристики регулятора Надо более точно калибрануть ADE7953, всё руки не доходят.
Z_h_e Доктор наук г. Чайковский 733 188
Отв.81  04 Мая 18, 18:31, через 4 мин
Можно и без второго таймера, но тогда надо каждый раз при изменении угла открытия пересчитывать ARR и CCRx регистры.Hold, 04 Мая 18, 18:27
Изначально я тоже на двух таймерах делал, но отказался. Считаю это избыток, имхо.
Hold Специалист Томск 129 88
Отв.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 мкс маскимум, хотя всё равно на таких мелких мощностях не работаем.
Sany531 Новичок Саяногорск 358 135
Отв.83  07 Мая 18, 05:44
Когда уже примеры регулятора пойдут для ф103 на одном таймере?
Hold Специалист Томск 129 88
Отв.84  07 Мая 18, 06:32, через 48 мин
Таймера General-Purpose не отличаются у семейств, настройки для F4 такие же для F1. Ну может чутка другие. Там строчек то...
К примеру для 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 84
Отв.85  07 Мая 18, 12:16
Когда уже примеры регулятора пойдут для ф103 на одном таймере?Sany531, 07 Мая 18, 05:44
[сообщение #13293668]
[сообщение #13294237]
SedoY Профессор Новосибирск 4686 1980
Отв.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 Доктор наук г. Чайковский 733 188
Отв.87  15 Июля 18, 18:39, через 3 мин
Попробуй тэг код использовать, а то в коде много ржущих морд Улыбающийся
SedoY Профессор Новосибирск 4686 1980
Отв.88  15 Июля 18, 18:44, через 5 мин
Z_h_e, пока галку не поставил "неиспользовать смайлы" от рожиц не избавился (веселенький код))))
Z_h_e Доктор наук г. Чайковский 733 188
Отв.89  15 Июля 18, 18:46, через 2 мин

 Непонимающий
  Думаю стоит модераторам обратить на это внимание, смайлы в коде не нужны.
Mnz Магистр Город 254 84
Отв.90  15 Июля 18, 23:04
Нужно использовать не тег pre, а code.
 :)  ;D  ::)  :-*
Hold Специалист Томск 129 88
Отв.91  16 Июля 18, 06:00
Код немного сыроват. Нет проверки что на линии вообще кто-то есть, нет обработки таймаута: если вдруг оборвется линия(или будем перетыкать разъем с датчиком), или DMA по какой-то помехе не примет 8 байт - навсегда повиснем в цикле while.
SedoY Профессор Новосибирск 4686 1980
Отв.92  16 Июля 18, 08:42
Hold, код же индусский))) сделал в целях познания.
примеры из сети работать "сразу" не захотели. "железо" мною ещё изучается
пару вечеров убил пока не въехал в DMA1->IFCR = DMA_IFCR_CTCIF5;   //Channel 5 Transfer Complete clear
Mnz Магистр Город 254 84
Отв.93  16 Июля 18, 12:46
примеры из сети работать "сразу" не захотели.SedoY, 16 Июля 18, 08:42
Эти рабочие. [сообщение #13275165]
[сообщение #13073672]
SedoY Профессор Новосибирск 4686 1980
Отв.94  16 Июля 18, 20:20
Mnz, не то все это, не то.можт и работает. но не по мне все эти наглядные структуры и прочие плюшки.
и вот ещё ньюанс: датчики не заработали на ардуиновских библиотеках (ну чуть большее у них время измерения - брак в общем) а ведь никто не лазиет по ардуиновским библиотекам чтоб чтото поправить.
а тут я код пишу с нуля, попутно изучая матчасть, и интересно и познавательно и вникаю в нюансы постепенно.

или DMA по какой-то помехе не примет 8 байт - навсегда повиснем в цикле whileHold, 16 Июля 18, 06:00
там контроль на передачу, думал - не нашел ситуаций, когда дма не передаст заданное количество байт (а не примет), приусловии что не произошел крах кристала.

Добавлено через 20дн. 23ч. 60мин.:

освоил создание схем и печаток, приятно удивлен прогрессу!
пульт4х7_6кн_2свд2цв.jpeg
пульт4х7_6кн_2свд2цв.jpeg STM32 - замена Arduino. Автоматика. Оборудование.
sidorenko61 Новичок Днепропетровск 2
Отв.95  21 Сент. 18, 12:35
как в программе EmBitz включить русский язык
SedoY Профессор Новосибирск 4686 1980
Отв.96  21 Сент. 18, 12:39, через 4 мин
sidorenko61, нужно ли?
sidorenko61 Новичок Днепропетровск 2
Отв.97  21 Сент. 18, 12:41, через 2 мин
Нужно
SedoY Профессор Новосибирск 4686 1980
Отв.98  21 Сент. 18, 12:50, через 9 мин
sidorenko61,
Скрытый текст
поиском вывалилось:
https://www.radiokot.ru/...64&start=60
https://tervel.livejournal.com/6468.html
попробуй
Mnz Магистр Город 254 84
Отв.99  21 Сент. 18, 23:50
Архив нужно распаковать в папку C:\Program Files\EmBitz\share\EmBitz\
Дальнейшая инструкция в файле readme.txt архива.
locale_ru_RU.7z 65.9 Кб