新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2017-5-18
- 在线时间
- 20 小时
|
30金钱
本帖最后由 769417953 于 2018-7-24 13:30 编辑
本人在写一个程序时主要功能实现一个传感器的3路时序输出采用定时器的同步功能来实现,其中TIM2输出主时钟信号CLK,TIM4输出移位信号SH,TIM1输出门信号ICG,TIM2设置为主模式,TIM1和TIM4设置为从模式由TIM2启动,现在问题出现在TIM4产生的移位信号和TIM1产生的门信号不同步的问题?示波器的图形如图:图中红色为移位信号SH 黄色为门信号ICG 理论中上的信号如图2:[mw_shl_code=c,true]
void TIM1_UP_IRQHandler(void)
{
u16 temp = 1000;
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
if(++fdgdg >= 20)
{
//if(Dis_flag)
// Dis_B();
fdgdg = 0;
}
if(ICG_Ready == 1)
{
while(temp--);
DMA_Cmd(DMA1_Channel1, ENABLE);//使能通道 1
if( Inner_Ave_Count <= Inner_Ave_Count_Set)//Inner_Ave_Count_Set )
{
if(Comm_Send_Mark)
{
Inner_Ave_Count++;
//XFL_TRIG_H();
//temp = 200;
//while(temp--);
//XFL_TRIG_L();
}
Data_Sum_Mark = 1;
ICG_Ready = 0;
}
else
{
if(Inner_Ave_Count > Inner_Ave_Count_Set)
{
Inner_Ave_Count = 0;
Comm_Send_Mark = 0;
}
else
ICG_Ready = 1;
}
}
}
/*******************************************************************************
* Function Name : TIM2_IRQHandler 定时器2中断处理函数
*******************************************************************************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2 , TIM_IT_CC1);
}
}
/*******************************************************************************
* Function Name : TIM3_IRQHandler 定时器3中断处理函数
*******************************************************************************/
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM3 , TIM_IT_CC3);
}
if(TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
{
TIM_ClearITPendingBit(TIM3 , TIM_IT_CC4);
}
}[/mw_shl_code][mw_shl_code=c,true]/**********************************
配制定时器1
开中断为1304ICG和DMA触发
***********************************/
void Tim1_config( void )
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM1);
u16 time_Pulse=399;
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated); //设置为从时钟模式
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1); //设置TIM1为从模式查表得受TIM2控制
/* Time base configuration */
TIM_BaseInitStructure.TIM_Period = time_Pulse;//Tim_Period_Val; //35;
TIM_BaseInitStructure.TIM_Prescaler = 39;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 5;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 20;
//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性为高即当输出xx%时为高电平
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1, ENABLE);//DISABLE//ENABLE
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
}
/**********************************
配制定时器2的通道1 PA0为1304CLK
PWM输出模式,占空比为50%
***********************************/
void Tim2_config(void)
{
vu16 CCR1_Val = 17;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 35;//
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* Master Configuration in PWM1 Mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Output Compare Mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 18;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //TIM2 设置为主时钟模式
/* Master Mode selection */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
}
/**********************************
配制定时器3的通道2 PA7为1/4的1304CLK
用来连接外部中断线11,触发AD1通道11进行AD转换
PWM输出模式,占空比为50%
***********************************/
void Tim3_config(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period = 143;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCMode_Toggle;//
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = 72;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性为高即当输出xx%时为高电平
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM3, ENABLE);//DISABLE//ENABLE
}
/**********************************
配制定时器4的通道1 PB6为1304_SH
sh_time为全局变量,用来改变积分时间
PWM输出模式
***********************************/
void Tim4_config(void)
{
u16 time_Pulse=399;
TIM_DeInit(TIM4);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Gated); //TIM4 设置为从时钟模式
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR1); //设置TIM1为从模式查表得受TIM2控制
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = time_Pulse;
TIM_TimeBaseStructure.TIM_Prescaler = 39;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* Master Configuration in PWM1 Mode*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Output Compare Mode
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 4;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
}[/mw_shl_code]
|
-
-
|