В какой-то из тем, тут, попались пользовательские блоки с настройками шима. Один блок в начале не оценил, позже поменял своё мнение. Там был настроен первый канал. Решил добавить каналы 2-4, с инверсией, дет-тайм, выравнивание по середине. Три канала работают, четвёртый молчит.
Где промахнулся с настройками, или что-то не дописал, пока не разобрался. Изучаю регистры всего пару дней, может у кого по более опытный глаз и укажет на правильное решение вопроса?
Сами блоки думаю смысла нет прикреплять, т.к. с ошибками и сырые. Текст ардуины положил под споилер.
СпойлерПоказать
Код: Выделить всё
#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));
}