优化H桥PWM并增加平滑调光

This commit is contained in:
2026-07-26 20:03:55 +08:00
parent d27b42a1f9
commit 56f2c18da4
174 changed files with 17943 additions and 17018 deletions
@@ -92,17 +92,26 @@ void timer0_2_init(void)
timer_cfg.timer_div_clk = TIMER_DIV_CLK_16MHzOr16K;
timer_cfg.timer_mode = TIMER_MODE_CYCLE;
/* Timer0 is the independent 1 kHz bridge direction scheduler. */
xc_timer_init(TIMER0_IDX, &timer_cfg);
xc_timer_set_value(TIMER0_IDX, us);
xc_timer_start(TIMER0_IDX);
xc_timer_init(TIMER1_IDX, &timer_cfg);
xc_timer_set_value(TIMER1_IDX, us);
xc_timer_start(TIMER1_IDX);
// Timer2 Config & Start
// Timer2 remains at 100 us for RF433 sampling.
xc_timer_init(TIMER2_IDX, &timer_cfg);
xc_timer_set_value(TIMER2_IDX, 100); //10us
xc_timer_set_value(TIMER2_IDX, 100);
xc_timer_start(TIMER2_IDX);
NVIC_SetPriority((IRQn_Type)TIMER2_IRQn,0);
NVIC_EnableIRQ((IRQn_Type)TIMER2_IRQn);
}
NVIC_SetPriority((IRQn_Type)TIMER0_IRQn, 0);
NVIC_EnableIRQ(TIMER0_IRQn);
NVIC_SetPriority((IRQn_Type)TIMER1_IRQn, 3);
NVIC_EnableIRQ(TIMER1_IRQn);
NVIC_SetPriority((IRQn_Type)TIMER2_IRQn, 1);
NVIC_EnableIRQ(TIMER2_IRQn);
}
@@ -117,8 +126,8 @@ void timer0_2_init(void)
*/
__RAM_CODE void timer0_callback(void *context)
{
// timer_status.t0_flag = true;
(void)context;
Bridge_Service_1ms();
}
/**
@@ -135,7 +144,8 @@ __RAM_CODE void timer1_callback(void *context)
// printf("dd=%d--%d--%d-%d-%d\r\n",choose_mode_falsg,W_PWM,C_PWM,driveMode,Brightness);
updateTimer(&timer1);
updateTimer(&timer2);
updateTimer(&timer2);
}
@@ -145,84 +155,18 @@ __RAM_CODE void timer1_callback(void *context)
* @details Timer2 handler callback function
* @param void *context
* @retval void
* 100us模拟1kHZ PWM
* Timer2 remains dedicated to 100 us RF433 sampling.
*/
uint8_t aa=0;
__RAM_CODE void timer2_callback(void *context) //10us
__RAM_CODE void timer2_callback(void *context)
{
rf433_receive();
if(deviceStatus==POWERON){
timeCnt++;
if(W_PWM_duty==0){deadTime_W=0;}
else {deadTime_W=_deadTime;}
if(C_PWM_duty==0){deadTime_C=0;}
else {deadTime_C=_deadTime;}
uint16_t totalPhase = (W_PWM_duty+deadTime_W) + (C_PWM_duty+deadTime_C) + 2*deadTime; //看注释为什么要这样加(W_PWM_duty+deadTime_W) + (C_PWM_duty+deadTime_C)
switch (driveMode)
{
case 0: // 正+反交替(周期切换)
if (timeCnt < deadTime)
{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
}
else
{
if (timeCnt <(deadTime + W_PWM_duty)) // 正转段
{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_SET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
}
else if (timeCnt < deadTime + W_PWM_duty + deadTime) // 死区时间
{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
}
else if (timeCnt < (totalPhase)) // 反转段
{
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_SET); // 互补输出低
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 主输出高
}
else
{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
}
}
break;
case 1: // 只正转
if(timeCnt<=W_PWM_duty){
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_SET); // 互补输出低
aa=0;
}else{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
aa=1;
}
break;
case 2: // 只反转
if(timeCnt<=C_PWM_duty){
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_SET); // 主输出高
}else{
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
}
break;
default:
xc_gpio_write_pin(IO_PWM_W, GPIO_PIN_RESET); // 互补输出低
xc_gpio_write_pin(IO_PWM_C, GPIO_PIN_RESET); // 主输出高
break;
}
if (timeCnt >= PWMMAX){timeCnt = 0;}
}
(void)context;
rf433_receive();
}
__RAM_CODE void timer3_callback(void *context)
{
(void)context;
Bridge_Deadtime_Expired();
}