|
100黑幣
最近在使用STM32F4系列單片機(jī)來控制三軸步進(jìn)電機(jī)運(yùn)動(dòng)。想用定時(shí)器3和定時(shí)器4做主從模式控制定時(shí)器3的三個(gè)通道分別輸出不同頻率的PWM及精準(zhǔn)脈沖數(shù)的控制信號(hào)。但是對(duì)主從控制模式還不太了解,想請(qǐng)教下各位有用過主從模式控制步進(jìn)電機(jī)的大佬們,這樣的方式能實(shí)現(xiàn)嗎,謝謝!如果可以實(shí)現(xiàn)這個(gè)功能,針對(duì)各個(gè)通道的獨(dú)立開啟和關(guān)閉PWM輸出是使用TIM_ITConfig(TIMx,TIM_IT_CCx,DISABLE);這個(gè)函數(shù)來執(zhí)行嗎?
另外,幫忙看下void Pulse_output(u32 Cycle, u32 PulseNum)這個(gè)函數(shù)要怎么調(diào)整才能實(shí)現(xiàn)各個(gè)通道獨(dú)立設(shè)置頻率和脈沖數(shù)的值,謝謝!
// 定時(shí)器3 主定時(shí)器
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; // 設(shè)置時(shí)鐘分頻系數(shù):不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計(jì)數(shù)模式
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); // 設(shè)置定時(shí)器3為主定時(shí)器模式
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); // 選擇觸發(fā)模式
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 從定時(shí)器
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; //設(shè)置從模式寄存器 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);
}
|
|