stm32f103c8(b) много вопросов

Ответить
asvhmao
Рядовой
Сообщения: 10
Зарегистрирован: 15.03.2024{, 00:10}
Репутация: 4
Откуда: Краснодар
Имя: сергей

stm32f103c8(b) много вопросов

#1

Сообщение asvhmao » 24.04.2024{, 19:44}

На сегодня пока вопрос по настройке таймера TIM1, позже ещё наверное много будет других.

В какой-то из тем, тут, попались пользовательские блоки с настройками шима. Один блок в начале не оценил, позже поменял своё мнение. Там был настроен первый канал. Решил добавить каналы 2-4, с инверсией, дет-тайм, выравнивание по середине. Три канала работают, четвёртый молчит.

Где промахнулся с настройками, или что-то не дописал, пока не разобрался. Изучаю регистры всего пару дней, может у кого по более опытный глаз и укажет на правильное решение вопроса?

IMG_20240424_002801.jpg
IMG_20240426_024510.jpg
Сами блоки думаю смысла нет прикреплять, т.к. с ошибками и сырые. Текст ардуины положил под споилер.
СпойлерПоказать

Код: Выделить всё

#include "flprogUtilites.h"
int16_t Timperiod;
int16_t PWM_1;
int16_t PWM_2;
int16_t PWM_3;
int16_t PWM_4;
int16_t Fr;
bool Q;
#define RCC_BASE 0x40021000
#define RCC_APB2ENR ((volatile uint32_t *)(RCC_BASE+0x18))
#define GPIOA_BASE 0x40010800
#define GPIOA_CRH ((volatile uint32_t *)(GPIOA_BASE+0x04))
#define GPIOB_BASE 0x40010C00
#define GPIOB_CRH ((volatile uint32_t *)(GPIOB_BASE+0x04))
#define TIM1_BASE 0x40012C00
#define TIM1_CNT ((volatile uint32_t *)(TIM1_BASE+0x24))
#define TIM1_CR1 ((volatile uint32_t *)(TIM1_BASE+0x00))
#define TIM1_CCMR1 ((volatile uint32_t *)(TIM1_BASE+0x18))
#define TIM1_CCMR2 ((volatile uint32_t *)(TIM1_BASE+0x1C))
#define TIM1_CCER ((volatile uint32_t *)(TIM1_BASE+0x20))
#define TIM1_PSC ((volatile uint32_t *)(TIM1_BASE+0x28))
#define TIM1_ARR ((volatile uint32_t *)(TIM1_BASE+0x2C))
#define TIM1_CCR1 ((volatile uint32_t *)(TIM1_BASE+0x34))
#define TIM1_CCR2 ((volatile uint32_t *)(TIM1_BASE+0x38))
#define TIM1_CCR3 ((volatile uint32_t *)(TIM1_BASE+0x3C))
#define TIM1_CCR4 ((volatile uint32_t *)(TIM1_BASE+0x40))
#define TIM1_BDTR ((volatile uint32_t *)(TIM1_BASE+0x44))
uint16_t test= 0;
uint16_t PWMcontrol= 0;
#define TIM1_CCER ((volatile uint32_t *)(TIM1_BASE+0x20))
#define TIM1_PSC ((volatile uint32_t *)(TIM1_BASE+0x28))
#define TIM1_ARR ((volatile uint32_t *)(TIM1_BASE+0x2C))
#define TIM1_CCR1 ((volatile uint32_t *)(TIM1_BASE+0x34))
#define TIM1_CCR2 ((volatile uint32_t *)(TIM1_BASE+0x38))
#define TIM1_CCR3 ((volatile uint32_t *)(TIM1_BASE+0x3C))
#define TIM1_CCR4 ((volatile uint32_t *)(TIM1_BASE+0x40))
#define TIM1_BDTR ((volatile uint32_t *)(TIM1_BASE+0x44))
int16_t _gtv2;
void setup()
{
    *RCC_APB2ENR |= 0x00000805;
    *GPIOA_CRH &= 0xFFFF0000;
    *GPIOA_CRH |= 0x0000BBBB;
    *GPIOB_CRH &= 0x000FFFFF;
    *GPIOB_CRH |= 0xBBB00000;
    *TIM1_ARR = Timperiod;
    *TIM1_CCMR1 = 0x00006868;
    *TIM1_CCMR2 = 0x00006868;
    *TIM1_CCER = 0x00001557;
    *TIM1_PSC = 72;
    *TIM1_BDTR = 0x00008000;
    *TIM1_CR1 = 0x00000061;
    *TIM1_CCR1 = 0x5;
    *TIM1_CCR2 = 0x5;
    *TIM1_CCR3 = 0x5;
    *TIM1_CCR4 = 0x5;
}
void loop()
{
    //Плата:1
    Timperiod = 255;
    PWM_1 = (255)-((map((_gtv2), (0), (4095), (0), (255))));
    PWM_2 = (map((_gtv2), (0), (4095), (0), (128)));
    PWM_3 = (map((_gtv2), (0), (4095), (0), (255)));
    PWM_4 = (map((_gtv2), (0), (4095), (0), (255)));
    *TIM1_ARR = Timperiod;
    PWMcontrol = PWM_1;
    PWMcontrol = constrain(PWM_1,0,Timperiod);
    *TIM1_CCR1 = PWMcontrol;
    PWMcontrol = PWM_2;
    PWMcontrol = constrain(PWM_2,0,Timperiod);
    *TIM1_CCR2 = PWMcontrol;
    PWMcontrol = PWM_3;
    PWMcontrol = constrain(PWM_3,0,Timperiod);
    *TIM1_CCR3 = PWMcontrol;
    PWMcontrol = PWM_4;
    PWMcontrol = constrain(PWM_4,0,Timperiod);
    *TIM1_CCR4 = PWMcontrol;
    // test= *TIM1_CNT;
// Fr=test;
    //   if (test >=PWMcontrol)
     //   {Q=false;}
     //   else
//    {Q=true;}
    _gtv2 =  (analogRead (197));
}

asvhmao
Рядовой
Сообщения: 10
Зарегистрирован: 15.03.2024{, 00:10}
Репутация: 4
Откуда: Краснодар
Имя: сергей

stm32f103c8(b) много вопросов

#2

Сообщение asvhmao » Вчера{, 02:38}

Решил по играть с пользовательским блоком "энкодер" и с EEPROM stm32. Раз девятая версия позволяет такие радости, почему бы и не попробовать?
По быстрому наколхозил картинку, типо менюшки с тремя переменными памяти, для предзагруки настроек энкодера. Проверка результата показала, что память грузит правильно, а два других микса по очерёдности уехали в конец коридора, из-за чего настройки первого меню убежали на второе, второго на третье и так по кругу.
Лёгким движением Ctrl+C, Ctrl+V, в тексте ардуины, поменял очерёдность и всё заработало как и задумывалось.

Прикреплённый первый файл с этой ошибкой.
Текст под спойлером, с выделенными фрагментами, это то что я поменял местами очерёдность из проекта.
.
Энкодер_EEPROM.jpg
.
Энкодер_EEPROM.flp
(1.31 МБ) 4 скачивания
СпойлерПоказать

Код: Выделить всё

#include "flprogUtilites.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "STM32encoder.h"
#include "flprogInternalEEPROM.h"
FLProgInternalEEPROM InternalEEPROM_41185707(7, 247);
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool en_enc;
int16_t Set;
uint8_t Set_dir;
int16_t Set_min;
int16_t Set_max;
bool en_Set;
int16_t pos_enc;
int16_t my_var;
bool Short_press;
bool Long_press;
STM32encoder enc(TIM2);
int16_t myVar= 0;
int16_t _gtv2;
int16_t _gtv3;
bool _gtv4;
int16_t _gtv6;
bool _gtv7;
int16_t _gtv8;
int16_t _gtv9;
bool _gtv10;
bool _gtv11;
bool _gtv13;
bool _dms1Q0 = 0;
bool _dms1Q1 = 0;
bool _dms1Q2 = 0;
int16_t _disp5oldLength = 0;
int16_t _disp1oldLength = 0;
bool _dms2Q0 = 0;
bool _dms2Q1 = 0;
bool _dms2Q2 = 0;
int16_t _disp4oldLength = 0;
int16_t _mux3;
int16_t _mux1;
int16_t _disp2oldLength = 0;
int16_t _mux2;
int16_t _disp3oldLength = 0;
bool _count1I = 0;
int16_t _count1_Value = 0;
void setup()
{
    Wire.begin();
    delay(10);
    InternalEEPROM_41185707.setIntegerStartValue(1, 0);
    InternalEEPROM_41185707.setIntegerStartValue(3, 2);
    InternalEEPROM_41185707.setIntegerStartValue(5, 23);
    InternalEEPROM_41185707.setSkippingEvents(0);
    InternalEEPROM_41185707.begin();
    _lcd1.init();
    _lcd1.backlight();
    enc.bind(&myVar, 1, 0, 100);
    enc.setButton(PA2);
}
void loop()
{
    InternalEEPROM_41185707.pool();
    if (_isNeedClearDisp1) 
    {
        _lcd1.clear();
        _isNeedClearDisp1= 0;
    }
    //Плата:1
    if (!(0)) 
    {
        _dispTempLength1 = ((((String("M ")) + ((String(_gtv6, DEC)))))).length();
        if (_disp1oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp1oldLength = _dispTempLength1;
        _lcd1.setCursor(0, 0);
        _lcd1.print((((String("M ")) + ((String(_gtv6, DEC))))));
    }
     else 
    {
        if (_disp1oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp1oldLength = 0;
        }
    }
    if((_gtv6) == 0) 
    {
        _mux1 = ((InternalEEPROM_41185707.readInteger(1)));
    }
    if((_gtv6) == 1) 
    {
        _mux1 = ((InternalEEPROM_41185707.readInteger(3)));
    }
    if((_gtv6) == 2) 
    {
        _mux1 = ((InternalEEPROM_41185707.readInteger(5)));
    }
    _gtv9 = _mux1;

  //  =================================================================

 if((_gtv6) == 0) 
    {
        _mux2 = 0;
    }
    if((_gtv6) == 1) 
    {
        _mux2 = -10;
    }
    if((_gtv6) == 2) 
    {
        _mux2 = 5;
    }
    _gtv3 = _mux2;

//===================================================================

      if((_gtv6) == 0) 
    {
        _mux3 = 100;
    }
    if((_gtv6) == 1) 
    {
        _mux3 = 10;
    }
    if((_gtv6) == 2) 
    {
        _mux3 = 50;
    }
    _gtv2 = _mux3;  

//  =================================================================  
    en_enc = !(0);
    Set = _gtv9;
    Set_dir = 1;
    Set_min = _gtv3;
    Set_max = _gtv2;
    en_Set = _gtv7;
    if(en_enc) 
    {
        Short_press = 0;
        Long_press = 0;
        switch(enc.button())
        {
            case BTN_EVT_CLICK:
            Short_press = 1;
            break;
            case BTN_EVT_LONG:
            Long_press = 1;
            break;
        }
        if (en_Set) 
        {
            myVar = Set;
            my_var = myVar;
            enc.bind(&myVar, Set_dir, Set_min, Set_max);
        }
        if (enc.isUpdated())
        {
            pos_enc = enc.pos();
            my_var = myVar;
        }
    }
    _gtv4 = Long_press;
    _gtv7 = Short_press;
    _gtv8 = my_var;
    if (!(0)) 
    {
        _dispTempLength1 = ((((String("S ")) + ((String(_gtv8, DEC)))))).length();
        if (_disp2oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp2oldLength = _dispTempLength1;
        _lcd1.setCursor(7, 0);
        _lcd1.print((((String("S ")) + ((String(_gtv8, DEC))))));
    }
     else 
    {
        if (_disp2oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp2oldLength = 0;
        }
    }

//=======================================================================================    
//    if((_gtv6) == 0) 
//    {
//        _mux2 = 0;
//    }
//    if((_gtv6) == 1) 
//    {
//        _mux2 = -10;
//    }
//    if((_gtv6) == 2) 
//    {
//        _mux2 = 5;
//    }
//    _gtv3 = _mux2;
//=======================================================================================
    
    if (_gtv10) 
    {
        InternalEEPROM_41185707.saveInteger(1, ((_gtv8)));
    }
    if (_gtv11) 
    {
        InternalEEPROM_41185707.saveInteger(3, ((_gtv8)));
    }    
    if (_gtv13) 
    {
        InternalEEPROM_41185707.saveInteger(5, ((_gtv8)));
    }
 //=======================================================================================           
    
    if((_gtv6 == 0))
    {
        _dms2Q0 = 1;
    }
    else 
    {
        _dms2Q0 = 0;
    }
    if((_gtv6 == 1))
    {
        _dms2Q1 = 1;
    }
    else 
    {
        _dms2Q1 = 0;
    }
    if((_gtv6 == 2))
    {
        _dms2Q2 = 1;
    }
    else 
    {
        _dms2Q2 = 0;
    }
    if (_dms2Q2) 
    {
        _dispTempLength1 = ((((String("E2 ")) + ((String(((InternalEEPROM_41185707.readInteger(5))), DEC)))))).length();
        if (_disp5oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp5oldLength = _dispTempLength1;
        _lcd1.setCursor(0, 1);
        _lcd1.print((((String("E2 ")) + ((String(((InternalEEPROM_41185707.readInteger(5))), DEC))))));
    }
     else 
    {
        if (_disp5oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp5oldLength = 0;
        }
    }
    if (_dms2Q1) 
    {
        _dispTempLength1 = ((((String("E1 ")) + ((String(((InternalEEPROM_41185707.readInteger(3))), DEC)))))).length();
        if (_disp4oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp4oldLength = _dispTempLength1;
        _lcd1.setCursor(0, 1);
        _lcd1.print((((String("E1 ")) + ((String(((InternalEEPROM_41185707.readInteger(3))), DEC))))));
    }
     else 
    {
        if (_disp4oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp4oldLength = 0;
        }
    }
    if (_dms2Q0) 
    {
        _dispTempLength1 = ((((String("E0 ")) + ((String(((InternalEEPROM_41185707.readInteger(1))), DEC)))))).length();
        if (_disp3oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp3oldLength = _dispTempLength1;
        _lcd1.setCursor(0, 1);
        _lcd1.print((((String("E0 ")) + ((String(((InternalEEPROM_41185707.readInteger(1))), DEC))))));
    }
     else 
    {
        if (_disp3oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp3oldLength = 0;
        }
    }
 //=============================================================   
//    if (_gtv13) 
//    {
//        InternalEEPROM_41185707.saveInteger(5, ((_gtv8)));
//    }
//===================================================================        
    
//  if((_gtv6) == 0) 
//    {
//        _mux3 = 100;
//    }
//    if((_gtv6) == 1) 
//    {
//        _mux3 = 10;
//    }
//    if((_gtv6) == 2) 
//    {
//        _mux3 = 50;
//    }
//    _gtv2 = _mux3; 

//======================================================================    
    
    if((_gtv6 == 0))
    {
        _dms1Q0 = _gtv4;
    }
    else 
    {
        _dms1Q0 = 0;
    }
    if((_gtv6 == 1))
    {
        _dms1Q1 = _gtv4;
    }
    else 
    {
        _dms1Q1 = 0;
    }
    if((_gtv6 == 2))
    {
        _dms1Q2 = _gtv4;
    }
    else 
    {
        _dms1Q2 = 0;
    }
    _gtv13 = _dms1Q2;
    _gtv11 = _dms1Q1;
    _gtv10 = _dms1Q0;
    if (_gtv7)
    {
        if (! _count1I) 
        {
            _count1I = 1;
            _count1_Value = _count1_Value + 1;
        }
    }
     else 
    {
        _count1I = 0;
    }
    if(_count1_Value >= 3) 
    {
        _count1_Value = 0;
    }
    _gtv6 = _count1_Value;
}
.
Далее я решил, в проекте с ошибкой, перед выводом en_Set поставить кастыль в виде стандартного блока FTrig, удивительно, но опять же всё заработало как и должно было.
.
.
Энкодер_EEPROM_2.jpg
.
.
IMG_20240504_024722.jpg
.
Энкодер_EEPROM_2.flp
(1.33 МБ) 8 скачиваний
.
Короткое описание тестового проекта:

При старте, в энкодере настройки по умолчанию, когда собирается проект. Шаг 1, мин 0, мах 100, позиция 0.
При коротком нажатии кнопки энкодера переходим в первое меню, с настройками мин -10, мах 10, позиция настроена в памяти EEPROM Set_E1, если правильно помню, то вроде 5 записывал.
Следующее короткое нажатие переход во второе меню, мин 5, мах 50, значение установки позиции Set_E2.
Третье нажатие возвращает в нулевое меню, а т.к. настройки начальные стёрли, то прописываются с помощью блоков Мих заново. Блок Set_E0 не обязателен, ставил просто для проверки, можно "0" прописать или использовать как третье меню, но уже без стартового.

Запись в память производится длинным нажатием кнопки энкодера.

Значения взяты произвольные, для примера, к реальным устройствам отношения не имеет.

Ответить

Вернуться в «STM32»