解决输出1pps移相问题
/* Includes ------------------------------------------------------------------*/
#include "tim.h"
#define C160M 160000000
#define C16M 16000000
/*时钟160M 初始脉宽1000ms*/
uint32_t pulse_width = C16M;//100ms
uint32_t gCmpTbl[3] = {C160M-1,(C160M-1 + pulse_width)%C160M,(C160M-1+C160M/2)%C160M};
uint8_t gPosiOrNega_Out = 0;
/* 串口中断*/
void TIM2_IRQHandler(void)
{
/*OUTPUT*/
if(LL_TIM_IsActiveFlag_CC3(TIM2))
{
LL_TIM_ClearFlag_CC3(TIM2);
if(LL_TIM_IsEnabledIT_CC3(TIM2))
{
if(gPosiOrNega_Out == 0 || gPosiOrNega_Out == 1)
{
if(LL_TIM_OC_getMode(TIM2) == LL_TIM_OCMODE_ACTIVE)
{
LL_TIM_OC_SetMode(TIM2, LL_TIM_CHANNEL_CH3, LL_TIM_OCMODE_INACTIVE);
}else
{
LL_TIM_OC_SetMode(TIM2, LL_TIM_CHANNEL_CH3, LL_TIM_OCMODE_ACTIVE);//上升沿
g_1pps_up_edge = 1;
}
}
else//gPosiOrNega_Out == 2 //c
{
if(flag_need_phase_shift == 1)
{
//更新abc
gCmpTbl[0] = (gCmpTbl[0] + phase_shift_num)%C160M;
gCmpTbl[1] = (gCmpTbl[0] + pulse_width + phase_shift_num)%C160M;
gCmpTbl[2] = (gCmpTbl[0] + C160M/2)%C160M;
}else
{
flag_need_phase_shift = 0;//flag_need_phase_shift = 1需要在上升沿之后
}
}
switch(gPosiOrNega_Out)
{
case 0:
//a
gPosiOrNega_Out = 1;
break;
case 1:
//b
gPosiOrNega_Out = 2;
break;
case 2:
//c
gPosiOrNega_Out = 0;
break;
default:
break;
}
}
}
}
/*主函数*/
void main()
{
while(1)
{
if(g_1pps_up_edge == 1)
{
g_1pps_up_edge = 0;
if(uart.cmd == phase_shift_cmd)
{
flag_need_phase_shift = 1;
phase_shift_num = -49;//test
}
else if(uart.cmd == pulse_width_cmd)
{
flag_need_phase_shift = 1;
pulse_width = -20;//test
}
}
}
}