20240312优化单片1pps输出

解决输出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
			}
		}	
	}	
}

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值