最近在使用STM32F4系列單片機來控制三軸步進電機運動。想用定時器3和定時器4做主從模式控制定時器3的三個通道分別輸出不同頻率的PWM及精準脈沖數的控制信號。但是對主從控制模式還不太了解,想請教下各位有用過主從模式控制步進電機的大佬們,這樣的方式能實現嗎,謝謝!如果可以實現這個功能,針對各個通道的獨立開啟和關閉PWM輸出是使用TIM_ITConfig(TIMx,TIM_IT_CCx,DISABLE);這個函數來執行嗎?
另外,幫忙看下void Pulse_output(u32 Cycle, u32 PulseNum)這個函數要怎么調整才能實現各個通道獨立設置頻率和脈沖數的值,謝謝!
// 定時器3 主定時器
void TIM3_Mode_Config(u32 cycle)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
SET_GPIO_AF_OUTPUT(GPIOC, GPIO_Pin_6);
SET_GPIO_AF_OUTPUT(GPIOC, GPIO_Pin_7);
SET_GPIO_AF_OUTPUT(GPIOC, GPIO_Pin_8);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = cycle - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 83;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 設置時鐘分頻系數:不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (cycle + 1)/2;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure)
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // 設置定時器3為主定時器模式
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); // 選擇觸發模式
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道1使能
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道2使能
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); // 通道3使能
TIM_ARRPreloadConfig(TIM3, ENABLE);
}
//TIM4 從定時器
void TIM4_config(u32 PulseNum)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PulseNum-1;
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);
TIM4->SMCR|=0x27; //設置從模式寄存器 ITR2(TS=010)
TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Pulse_output(u32 Cycle, u32 PulseNum)
{
TIM4_config(PulseNum);
TIM_Cmd(TIM4, ENABLE);
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM3_Mode_Config(Cycle);
TIM_Cmd(TIM3, ENABLE);
}
|