找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4180|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

STM32F4單片機(jī)主從定時(shí)器是否能分別同時(shí)控制三個(gè)通道輸出不同頻率PWM信號(hào)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:8840 發(fā)表于 2021-9-7 23:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
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);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:891041 發(fā)表于 2021-9-8 20:00 | 只看該作者
你是要同時(shí)輸出三路么。 如果是同時(shí)而且不同頻率 我推薦用三個(gè)定時(shí)器。用單脈沖模式 配合RCR就行了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:8840 發(fā)表于 2021-9-8 22:02 | 只看該作者
abob 發(fā)表于 2021-9-8 20:00
你是要同時(shí)輸出三路么。 如果是同時(shí)而且不同頻率 我推薦用三個(gè)定時(shí)器。用單脈沖模式 配合RCR就行了。

謝謝你的回復(fù),是需要輸出三路不同頻率和脈沖數(shù)的PWM信號(hào)來控制三個(gè)步進(jìn)電機(jī),因?yàn)槌绦虺穗姍C(jī)控制還有其他的數(shù)據(jù)運(yùn)算,包括S型加減速處理,與上位機(jī)實(shí)時(shí)數(shù)據(jù)通訊及傳感器檢測等需要處理,想用主從模式減少電機(jī)控制對(duì)內(nèi)存的消耗的。之前就是采用三個(gè)獨(dú)立的定時(shí)器分別控制的。
回復(fù)

使用道具 舉報(bào)

地板
ID:307171 發(fā)表于 2023-8-14 19:31 | 只看該作者
您好,使用一個(gè)定時(shí)器的多個(gè)通道可以產(chǎn)生不同頻率的脈沖,就是用比較匹配翻轉(zhuǎn)模式,并且需要開啟中斷,比較匹配發(fā)生后,進(jìn)入中斷處理程序,在其中更新該通道的比較寄存器值即可。

實(shí)際上我是來問問題的,以上這種方式的確可以實(shí)現(xiàn)一個(gè)定時(shí)器多個(gè)通道不同頻率脈沖,但在我實(shí)際使用中,發(fā)現(xiàn)會(huì)有通道丟失現(xiàn)象,原因還不清楚,請(qǐng)問您現(xiàn)在使用什么方式驅(qū)動(dòng)的?
回復(fù)

使用道具 舉報(bào)

5#
ID:752974 發(fā)表于 2023-8-15 08:33 | 只看該作者
要想輸出不同頻率的PWM,必須用多個(gè)定時(shí)器;一個(gè)定時(shí)器可以輸出多個(gè)PWM,但這幾個(gè)PWM只能是同頻的。
回復(fù)

使用道具 舉報(bào)

6#
ID:1040201 發(fā)表于 2023-8-16 10:22 | 只看該作者
用一個(gè)基本定時(shí)器  3個(gè)IO口模擬PWM呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表