国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)

這篇具有很好參考價(jià)值的文章主要介紹了STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)

1.1高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)原理

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

1.2高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)實(shí)驗(yàn)配置步驟

1,配置定時(shí)器基礎(chǔ)工作參數(shù) HAL_TIM_OC_Init()
2,定時(shí)器PWM輸出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置PWM模式/比較值等 HAL_TIM_OC_ConfigChannel()
4,使能通道預(yù)裝載 __HAL_TIM_ENABLE_OCxPRELOAD()
5,使能輸出、主輸出、計(jì)數(shù)器 HAL_TIM_OC_Start()
6,修改捕獲/比較寄存器的值 _HAL_TIM_SET_COMPARE()
STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

1.3 高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)要求

1)通過(guò)定時(shí)器8通道1/2/3/4輸出相位分別為25%、50%、75%、100%的PWM
2,配置輸出比較模式為:翻轉(zhuǎn)
通道輸出極性為:高電平有效

2 高級(jí)定時(shí)器互補(bǔ)輸出帶死區(qū)控制實(shí)驗(yàn)

2.1互補(bǔ)輸出 死區(qū)時(shí)間

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

2.3帶死區(qū)控制的互補(bǔ)輸出應(yīng)用H橋

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

2.4捕獲/比較通道的輸出部分(通道1至3)

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

2.5死區(qū)時(shí)間計(jì)算

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

2.6 剎車(斷路)功能

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)
TIMx_BKIN: IO復(fù)用口
BI由BRK(輸入信號(hào)極性)故障事件決定

2.7高級(jí)定時(shí)器互補(bǔ)輸出帶死區(qū)控制實(shí)驗(yàn)配置步驟

1,配置定時(shí)器基礎(chǔ)工作參數(shù) HAL_TIM_PWM_Init()
2,定時(shí)器PWM輸出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置PWM模式/比較值等 HAL_TIM_PWM_ConfigChannel()
4,配置剎車功能、死區(qū)時(shí)間等 HAL_TIMEx_ConfigBreakDeadTime()
5,使能輸出、主輸出、計(jì)數(shù)器 HAL_TIM_PWM_Start()
6,使能互補(bǔ)輸出、主輸出、計(jì)數(shù)器 HAL_TIMEx_PWMN_Start()
STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

2.8剎車死區(qū)時(shí)間結(jié)構(gòu)體

typedef struct
{
uint32_t OffStateRunMode; /* 運(yùn)行模式下的關(guān)閉狀態(tài)選擇 /
uint32_t OffStateIDLEMode; /
空閑模式下的關(guān)閉狀態(tài)選擇 /
uint32_t LockLevel; /
寄存器鎖定設(shè)置 /
uint32_t DeadTime; /
死區(qū)時(shí)間設(shè)置 /
uint32_t BreakState; /
是否使能剎車功能 /
uint32_t BreakPolarity; /
剎車輸入極性 /
uint32_t BreakFilter; /
剎車輸入濾波器(F1/F4系列沒(méi)有) /
uint32_t AutomaticOutput; /
自動(dòng)恢復(fù)輸出使能,即使能AOE位 */
} TIM_BreakDeadTimeConfigTypeDef;

2.9 高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)要求

1)通過(guò)定時(shí)器1通道1輸出頻率為1KHz,占空比為70%的PWM,使用PWM模式1
使能互補(bǔ)輸出并設(shè)置死區(qū)時(shí)間控制:設(shè)置DTG為100(5.56us),進(jìn)行驗(yàn)證死區(qū)時(shí)間是否正確
使能剎車功能:剎車輸入信號(hào)高電平有效,配置輸出空閑狀態(tài)等,最后用示波器驗(yàn)證
2)H橋?yàn)槔?,配置通道輸出極性以及互補(bǔ)輸出極性
高級(jí)定時(shí)器輸入原理

3 高級(jí)定時(shí)器輸入模式實(shí)戰(zhàn)

3.1 高級(jí)定時(shí)器輸入模式工作原理

STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)
STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

3.2 高級(jí)定時(shí)器PWM輸入模式實(shí)驗(yàn)配置步驟

1,配置定時(shí)器基礎(chǔ)工作參數(shù) HAL_TIM_IC_Init()
2,定時(shí)器捕獲輸入MSP初始化 HAL_TIM_IC_MspInit() 配置NVIC、CLOCK、GPIO等
3,配置IC1/2映射、捕獲邊沿等 HAL_TIM_IC_ConfigChannel()
4,配置從模式,觸發(fā)源等 HAL_TIM_SlaveConfigSynchro()
5,設(shè)置優(yōu)先級(jí),使能中斷 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
6,使能捕獲、捕獲中斷及計(jì)數(shù)器 HAL_TIM_IC_Start_IT()、 HAL_TIM_IC_Start()
7,編寫中斷服務(wù)函數(shù) TIMx_IRQHandler()等 HAL_TIM_IRQHandler()
8,編寫輸入捕獲回調(diào)函數(shù) HAL_TIM_IC_CaptureCallback()
STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn),stm32,嵌入式硬件,單片機(jī)

3.3 關(guān)鍵結(jié)構(gòu)體

typedef struct
{
uint32_t ICPolarity; /* 輸入捕獲觸發(fā)方式選擇,比如上升、下降沿捕獲 /
uint32_t ICSelection; /
輸入捕獲選擇,用于設(shè)置映射關(guān)系 /
uint32_t ICPrescaler; /
輸入捕獲分頻系數(shù) /
uint32_t ICFilter; /
輸入捕獲濾波器設(shè)置 */
} TIM_IC_InitTypeDef;

typedef struct
{
uint32_t SlaveMode; /* 從模式選擇 /
uint32_t InputTrigger; /
輸入觸發(fā)源選擇 /
uint32_t TriggerPolarity; /
輸入觸發(fā)極性 /
uint32_t TriggerPrescaler; /
輸入觸發(fā)預(yù)分頻 /
uint32_t TriggerFilter; /
輸入濾波器設(shè)置 */
} TIM_SlaveConfigTypeDef;

3.4 高級(jí)定時(shí)器PWM輸入模式實(shí)驗(yàn)要求

通過(guò)定時(shí)器3通道2(PB5)輸出PWM
將PWM輸入到定時(shí)器8通道1(PC6),測(cè)量PWM的頻率/周期、占空比等信息文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-783270.html

2.1 atim.c

/*******************************以下是高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)程序**************************************/

TIM_HandleTypeDef g_timx_comp_pwm_handle;       /* 定時(shí)器x句柄 */

/**
 * @brief       高級(jí)定時(shí)器TIMX 輸出比較模式 初始化函數(shù)(使用輸出比較模式)
 * @note
 *              配置高級(jí)定時(shí)器TIMX 4路輸出比較模式PWM輸出,實(shí)現(xiàn)50%占空比,不同相位控制
 *              注意,本例程輸出比較模式,每2個(gè)計(jì)數(shù)周期才能完成一個(gè)PWM輸出,因此輸出頻率減半
 *              另外,我們還可以開(kāi)啟中斷在中斷里面修改CCRx,從而實(shí)現(xiàn)不同頻率/不同相位的控制
 *              但是我們不推薦這么使用,因?yàn)檫@可能導(dǎo)致非常頻繁的中斷,從而占用大量CPU資源
 *
 *              高級(jí)定時(shí)器的時(shí)鐘來(lái)自APB2, 而PCLK2 = 168Mhz, 我們?cè)O(shè)置PPRE2不分頻, 因此
 *              高級(jí)定時(shí)器時(shí)鐘 = 168Mhz
 *              定時(shí)器溢出時(shí)間計(jì)算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=定時(shí)器工作頻率,單位:Mhz
 *
 * @param       arr: 自動(dòng)重裝值。
 * @param       psc: 預(yù)分頻系數(shù)
 * @retval      無(wú)
 */

//1.聲明定時(shí)器句柄
TIM_HandleTypeDef  g_timx_com_pwm_handler;
//2.配置通用定時(shí)器基本工作參數(shù)
void atim_timx_com_pwm_init(uint16_t arr, uint16_t psc)
{
       //4.1定時(shí)器輸出比較定時(shí)器結(jié)構(gòu)體初始化
    TIM_OC_InitTypeDef tim_oc_com_pwm = {0};
    
    //2.1通用定時(shí)器PWM輸出初始化
    g_timx_com_pwm_handler.Instance = ATIM_TIMX_NPWM;                  //定時(shí)器x
    g_timx_com_pwm_handler.Init.Period = arr;
    g_timx_com_pwm_handler.Init.Prescaler = psc;
    g_timx_com_pwm_handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    g_timx_com_pwm_handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能TIMx_ARR進(jìn)行緩沖 */
    HAL_TIM_OC_Init(&g_timx_com_pwm_handler);
    
    
    //5.輸出比較配置包,括PWM模式和比較值
    tim_oc_com_pwm.OCMode = TIM_OCMODE_TOGGLE;          //輸出比較模式 PWM1
    tim_oc_com_pwm.Pulse = 250-1;                     //設(shè)置比較值為自動(dòng)加載值的一般,則占空比為50%
    tim_oc_com_pwm.OCPolarity = TIM_OCPOLARITY_HIGH;   //設(shè)置輸出比較的極性為高
    HAL_TIM_PWM_ConfigChannel(&g_timx_com_pwm_handler,&tim_oc_com_pwm,TIM_CHANNEL_1); //初始化定時(shí)器的輸出比較通道1
    __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_com_pwm_handler,TIM_CHANNEL_1);  //通道1 預(yù)裝載使能
    
    tim_oc_com_pwm.Pulse = 500-1;                     //設(shè)置比較值為自動(dòng)加載值的一般,則占空比為50%
    HAL_TIM_PWM_ConfigChannel(&g_timx_com_pwm_handler,&tim_oc_com_pwm,TIM_CHANNEL_2); //初始化定時(shí)器的輸出比較通道1
    __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_com_pwm_handler,TIM_CHANNEL_2);  //通道1 預(yù)裝載使能
    
    tim_oc_com_pwm.Pulse = 750-1;                     //設(shè)置比較值為自動(dòng)加載值的一般,則占空比為50%
    HAL_TIM_PWM_ConfigChannel(&g_timx_com_pwm_handler,&tim_oc_com_pwm,TIM_CHANNEL_3); //初始化定時(shí)器的輸出比較通道1
    __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_com_pwm_handler,TIM_CHANNEL_3);  //通道1 預(yù)裝載使能
    
    tim_oc_com_pwm.Pulse = 1000-1;                     //設(shè)置比較值為自動(dòng)加載值的一般,則占空比為50%
    HAL_TIM_PWM_ConfigChannel(&g_timx_com_pwm_handler,&tim_oc_com_pwm,TIM_CHANNEL_4); //初始化定時(shí)器的輸出比較通道1
    __HAL_TIM_ENABLE_OCxPRELOAD(&g_timx_com_pwm_handler,TIM_CHANNEL_4);  //通道1 預(yù)裝載使能

    
    //5,開(kāi)啟對(duì)應(yīng)PWM通道使能輸出并啟動(dòng)計(jì)時(shí)器
    HAL_TIM_OC_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_1);
    HAL_TIM_OC_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_2);
    HAL_TIM_OC_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_3);
    HAL_TIM_OC_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_4);
}

//3.定時(shí)器PWM輸出底層初始化,定時(shí)器時(shí)鐘、引腳時(shí)鐘使能,引腳復(fù)用配置
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef * htm)
{
    //3.1判斷是否是TIM14
    if(htm->Instance ==  ATIM_TIMX_NPWM)
    {
         GPIO_InitTypeDef gpio_init_struct;
     
        //3.3使能PF引腳口時(shí)鐘
        ATIM_TIMX_COMP_CH1_GPIO_CLK_ENABLE();
        ATIM_TIMX_COMP_CH2_GPIO_CLK_ENABLE();
        ATIM_TIMX_COMP_CH3_GPIO_CLK_ENABLE();
        ATIM_TIMX_COMP_CH4_GPIO_CLK_ENABLE();
        
        //3.4使能定時(shí)器時(shí)鐘
        ATIM_TIMX_COMP_CLK_ENABLE();
       
       
      //3.2通道y的GPIO初始化
      gpio_init_struct.Pin = ATIM_TIMX_COMP_CH1_GPIO_PIN;      /* 通道1 GPIO口 */
      gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 復(fù)用推挽輸出 */
      gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
      gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */ 
      gpio_init_struct.Alternate =ATIM_TIMX_NPWM_CHY_GPIO_AF; /* 端口復(fù)用到TIM8 */ 
      HAL_GPIO_Init(ATIM_TIMX_COMP_CH1_GPIO_PORT, &gpio_init_struct);  
        
      gpio_init_struct.Pin = ATIM_TIMX_COMP_CH2_GPIO_PIN;      /* 通道2 GPIO口 */
      HAL_GPIO_Init(ATIM_TIMX_COMP_CH2_GPIO_PORT, &gpio_init_struct); 
      
      gpio_init_struct.Pin = ATIM_TIMX_COMP_CH3_GPIO_PIN;      /* 通道3 GPIO口 */
      HAL_GPIO_Init(ATIM_TIMX_COMP_CH3_GPIO_PORT, &gpio_init_struct); 
      
      gpio_init_struct.Pin = ATIM_TIMX_COMP_CH4_GPIO_PIN;      /* 通道4 GPIO口 */
      HAL_GPIO_Init(ATIM_TIMX_COMP_CH4_GPIO_PORT, &gpio_init_struct); 

    }
}


/*******************************以下是高級(jí)定時(shí)器互補(bǔ)輸出帶死區(qū)時(shí)間控制實(shí)驗(yàn)程序**************************************/

//1.定義句柄、定義死區(qū)時(shí)間
TIM_HandleTypeDef g_timx_cplm_pwm_handler;       /* 定時(shí)器x句柄 */
TIM_BreakDeadTimeConfigTypeDef  g_break_dead_time_config ={0};
/**
 * @brief       高級(jí)定時(shí)器TIMX 互補(bǔ)輸出 初始化函數(shù)(使用PWM模式1)
 * @note
 *              配置高級(jí)定時(shí)器TIMX 互補(bǔ)輸出, 一路OCy 一路OCyN, 并且可以設(shè)置死區(qū)時(shí)間
 *
 *              高級(jí)定時(shí)器的時(shí)鐘來(lái)自APB2, 而PCLK2 = 168Mhz, 我們?cè)O(shè)置PPRE2不分頻, 因此
 *              高級(jí)定時(shí)器時(shí)鐘 = 168Mhz
 *              定時(shí)器溢出時(shí)間計(jì)算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=定時(shí)器工作頻率, 單位 : Mhz
 *
 * @param       arr: 自動(dòng)重裝值。
 * @param       psc: 預(yù)分頻系數(shù)
 * @retval      無(wú)
 */
//2,配置定時(shí)器基礎(chǔ)工作參數(shù) 
void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc)
{
    //3.1GPIO結(jié)構(gòu)體初始化
    GPIO_InitTypeDef gpio_init_struct = {0};
    
    //3.2定時(shí)器時(shí)鐘使能、通道對(duì)應(yīng)IO口時(shí)鐘使能
    ATIM_TIMX_CPLM_CHY_CLK_ENABLE();             /* TIMx 時(shí)鐘使能 */
    
    ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE();        /* 通道X對(duì)應(yīng)IO口時(shí)鐘使能 */
    ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE();       /* 通道X互補(bǔ)通道對(duì)應(yīng)IO口時(shí)鐘使能 */
    ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE();       /* 通道X剎車輸入對(duì)應(yīng)IO口時(shí)鐘使能 */
    
    
    //4.1定時(shí)器輸出結(jié)構(gòu)體初始化
    TIM_OC_InitTypeDef tim_oc_cplm_pwm = {0};
    
    
    //2.1通用定時(shí)器PWM輸出初始化
    g_timx_cplm_pwm_handler.Instance = ATIM_TIMX_CPLM;                  //定時(shí)器x
    g_timx_cplm_pwm_handler.Init.Period = arr;
    g_timx_cplm_pwm_handler.Init.Prescaler = psc;
    g_timx_cplm_pwm_handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    g_timx_cplm_pwm_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;  //CKD[1:0]= 10,tDTS =4 * tCK_INT =Ft/4 =42Mhz
    g_timx_cplm_pwm_handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能影子寄存器TIMx_ARR進(jìn)行緩沖 */
    HAL_TIM_OC_Init(&g_timx_com_pwm_handler);
    
    //3 PE8/PE9/PE15引腳復(fù)用設(shè)置以及通道對(duì)應(yīng)IO時(shí)鐘使能與時(shí)鐘使能
    gpio_init_struct.Pin = ATIM_TIMX_CPLM_BKIN_GPIO_PIN;    /*剎車輸入引腳*/ 
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 復(fù)用推挽輸出 */ 
    gpio_init_struct.Pull = GPIO_PULLDOWN;                  /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    gpio_init_struct.Alternate =ATIM_TIMX_CPLM_CHY_GPIO_AF; /* 端口復(fù)用到TIM1 */   
    HAL_GPIO_Init(ATIM_TIMX_CPLM_BKIN_GPIO_PORT, &gpio_init_struct);
    
    gpio_init_struct.Pin = ATIM_TIMX_CPLM_CHY_GPIO_PIN;    /*輸出通道引腳*/ 
    HAL_GPIO_Init(ATIM_TIMX_CPLM_CHY_GPIO_PORT, &gpio_init_struct);
    
    gpio_init_struct.Pin = ATIM_TIMX_CPLM_CHYN_GPIO_PIN;    /*互補(bǔ)通道引腳*/ 
    HAL_GPIO_Init(ATIM_TIMX_CPLM_CHYN_GPIO_PORT, &gpio_init_struct);
    
    //4.配置PWM模式/比較值等
    tim_oc_cplm_pwm.OCMode = TIM_OCMODE_PWM1;            //輸出比較模式 PWM1
    tim_oc_cplm_pwm.OCPolarity = TIM_OCPOLARITY_HIGH;    //OCy高電平有效
    tim_oc_cplm_pwm.OCNPolarity = TIM_OCPOLARITY_HIGH;   //OCy高電平有效
    tim_oc_cplm_pwm.OCIdleState = TIM_OCIDLESTATE_SET;   //當(dāng)前MOE = 0,OCx=0
    tim_oc_cplm_pwm.OCNIdleState = TIM_OCIDLESTATE_SET;   //當(dāng)前MOE = 0,OCxN=0
    HAL_TIM_PWM_ConfigChannel(&g_timx_com_pwm_handler,&tim_oc_cplm_pwm,ATIM_TIMX_CPLM_CHY); //初始化定時(shí)器的輸出比較通道1
    
    //5.配置剎車功能、死區(qū)參數(shù),開(kāi)啟死區(qū)中斷
    g_break_dead_time_config.OffStateRunMode = TIM_OSSR_DISABLE;   //運(yùn)行模式關(guān)閉輸出狀態(tài)
    g_break_dead_time_config.OffStateIDLEMode = TIM_OSSI_DISABLE;  //空閑模式關(guān)閉輸出狀態(tài)
    g_break_dead_time_config.LockLevel = TIM_LOCKLEVEL_OFF;        //不用寄存器鎖功能
    g_break_dead_time_config.BreakState = TIM_BREAK_ENABLE;        //使能剎車輸入
    g_break_dead_time_config.BreakPolarity = TIM_BREAKPOLARITY_HIGH; //剎車輸入有效信號(hào)為高
    g_break_dead_time_config.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;//使能AOE位,允許剎車結(jié)束后自動(dòng)恢復(fù)輸出 
    HAL_TIMEx_ConfigBreakDeadTime(&g_timx_com_pwm_handler,&g_break_dead_time_config); //初始化剎車死區(qū)時(shí)間
    
   //6,開(kāi)啟對(duì)應(yīng)PWM通道使能輸出并啟動(dòng)計(jì)時(shí)器
    HAL_TIM_PWM_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_1);    //OCy 輸出使能
    HAL_TIMEx_PWMN_Start(&g_timx_com_pwm_handler,TIM_CHANNEL_1);    //OCyN 輸出使能
}
/**
 * @brief       定時(shí)器TIMX 設(shè)置輸出比較值 & 死區(qū)時(shí)間
 * @param       ccr: 輸出比較值
 * @param       dtg: 死區(qū)時(shí)間
 *   @arg       dtg[7:5]=0xx時(shí), 死區(qū)時(shí)間 = dtg[7:0] * tDTS
 *   @arg       dtg[7:5]=10x時(shí), 死區(qū)時(shí)間 = (64 + dtg[6:0]) * 2  * tDTS
 *   @arg       dtg[7:5]=110時(shí), 死區(qū)時(shí)間 = (32 + dtg[5:0]) * 8  * tDTS
 *   @arg       dtg[7:5]=111時(shí), 死區(qū)時(shí)間 = (32 + dtg[5:0]) * 16 * tDTS
 *   @note      tDTS = 1 / (Ft /  CKD[1:0]) = 1 / 42M = 23.8ns
 * @retval      無(wú)
 */

//7 設(shè)置輸出比較值與死區(qū)時(shí)間
void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg)
{
    g_break_dead_time_config.DeadTime = dtg;
    HAL_TIMEx_ConfigBreakDeadTime(&g_timx_com_pwm_handler,&g_break_dead_time_config); //重設(shè)死區(qū)時(shí)間
    __HAL_TIM_MOE_ENABLE(&g_timx_com_pwm_handler);                                    //MOE等于1,使能主輸出
    ATIM_TIMX_CPLM_CHY_CCRX = ccr;                                                    //設(shè)置比較寄存器
}

/*******************************高級(jí)定時(shí)器PWM輸入模式程序**************************************/

TIM_HandleTypeDef g_timx_pwmin_chy_handler;   /* 定時(shí)器x句柄 */

/* PWM輸入狀態(tài)(g_timxchy_cap_sta)
 * 0,沒(méi)有成功捕獲.
 * 1,已經(jīng)成功捕獲了
 */
uint8_t g_timxchy_pwmin_sta  = 0;   /* PWM輸入狀態(tài) */
uint16_t g_timxchy_pwmin_psc  = 0;  /* PWM輸入分頻系數(shù) */
uint32_t g_timxchy_pwmin_hval = 0;  /* PWM的高電平脈寬 */
uint32_t g_timxchy_pwmin_cval = 0;  /* PWM的周期寬度 */

/**
 * @brief       定時(shí)器TIMX 通道Y PWM輸入模式 初始化函數(shù)
 * @note
 *              高級(jí)定時(shí)器的時(shí)鐘來(lái)自APB2, 而PCLK2 = 168Mhz, 我們?cè)O(shè)置PPRE2不分頻, 因此
 *              高級(jí)定時(shí)器時(shí)鐘 = 168Mhz
 *              定時(shí)器溢出時(shí)間計(jì)算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=定時(shí)器工作頻率,單位:Mhz
 *
 * @param       無(wú)
 * @retval      無(wú)
 */
 //2,配置定時(shí)器基礎(chǔ)工作參數(shù) 
void atim_timx_pwmin_chy_init(void)                        /* 高級(jí)定時(shí)器 PWM輸入模式初始化 */
{
     //3.1GPIO結(jié)構(gòu)體初始化
    GPIO_InitTypeDef gpio_init_struct = {0};
    
    //從模式初始化配置
    TIM_SlaveConfigTypeDef slave_config = {0};
    
    //4.1輸入初始化配置
    TIM_IC_InitTypeDef tim_ic_pwmin_chy = {0};
    
    //3.2定時(shí)器時(shí)鐘使能、通道對(duì)應(yīng)IO口時(shí)鐘使能
    ATIM_TIMX_PWMIN_CHY_GPIO_CLK_ENABLE();        /* IO口時(shí)鐘使能 */
    ATIM_TIMX_PWMIN_CHY_CLK_ENABLE();           /* TIM8 時(shí)鐘使能 */

    
    
    
    //2.1通用定時(shí)器PWM輸出初始化
    g_timx_pwmin_chy_handler.Instance = ATIM_TIMX_PWMIN;                  //定時(shí)器8
    g_timx_pwmin_chy_handler.Init.Period = 65535;
    g_timx_pwmin_chy_handler.Init.Prescaler = 0;
    g_timx_pwmin_chy_handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_IC_Init(&g_timx_pwmin_chy_handler);
    
    //3 PC6引腳復(fù)用設(shè)置以及通道對(duì)應(yīng)IO時(shí)鐘使能與時(shí)鐘使能
    gpio_init_struct.Pin = ATIM_TIMX_PWMIN_CHY_GPIO_PIN;    /*輸出引腳*/ 
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 復(fù)用推挽輸出 */ 
    gpio_init_struct.Pull = GPIO_PULLDOWN;                  /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    gpio_init_struct.Alternate =ATIM_TIMX_PWMIN_CHY_GPIO_AF; /* 端口復(fù)用到TIM8 */   
    HAL_GPIO_Init(ATIM_TIMX_PWMIN_CHY_GPIO_PORT, &gpio_init_struct);
    
        /* 從模式配置,IT1觸發(fā)更新 */
    slave_config.SlaveMode = TIM_SLAVEMODE_RESET;                   /* 從模式:復(fù)位模式 */
    //4.IC1捕獲:上升沿觸發(fā)TI1FP1
    tim_ic_pwmin_chy.ICPolarity = TIM_ICPOLARITY_RISING;      //上升沿檢測(cè)
    tim_ic_pwmin_chy.ICSelection = TIM_ICSELECTION_DIRECTTI;  //選擇輸入端IC1映射到TI1
    tim_ic_pwmin_chy.ICPrescaler = TIM_ICPSC_DIV1;            //不分頻
    tim_ic_pwmin_chy.ICFilter = 0;                            //選擇輸入端IC1映射到TI1
    HAL_TIM_IC_ConfigChannel(&g_timx_pwmin_chy_handler, &tim_ic_pwmin_chy, ATIM_TIMX_PWMIN_CHY);
    
    //5.IC2捕獲:上升沿觸發(fā)TI1FP2
    tim_ic_pwmin_chy.ICPolarity = TIM_ICPOLARITY_FALLING;      //上升沿檢測(cè)
    tim_ic_pwmin_chy.ICSelection = TIM_ICSELECTION_INDIRECTTI;  //選擇輸入端IC2映射到TI1
    HAL_TIM_IC_ConfigChannel(&g_timx_pwmin_chy_handler, &tim_ic_pwmin_chy, TIM_CHANNEL_2);
    
    HAL_NVIC_SetPriority(ATIM_TIMX_PWMIN_IRQn, 1, 3);               /* 設(shè)置中斷優(yōu)先級(jí),搶占優(yōu)先級(jí)1,子優(yōu)先級(jí)3 */
    HAL_NVIC_EnableIRQ( ATIM_TIMX_PWMIN_IRQn );                     /* 開(kāi)啟TIMx中斷 */
    
        /* TIM1/TIM8有獨(dú)立的輸入捕獲中斷服務(wù)函數(shù) */
    if ( ATIM_TIMX_PWMIN == TIM1 || ATIM_TIMX_PWMIN == TIM8)
    {
        HAL_NVIC_SetPriority(ATIM_TIMX_PWMIN_CC_IRQn, 1, 3);        /* 設(shè)置中斷優(yōu)先級(jí),搶占優(yōu)先級(jí)1,子優(yōu)先級(jí)3 */
        HAL_NVIC_EnableIRQ(ATIM_TIMX_PWMIN_CC_IRQn);                /* 開(kāi)啟TIMx中斷 */
    }
    
   //6,開(kāi)啟對(duì)應(yīng)PWM通道使能輸入并啟動(dòng)計(jì)時(shí)器
   __HAL_TIM_ENABLE_IT(&g_timx_pwmin_chy_handler, TIM_IT_UPDATE);
    HAL_TIM_IC_Start_IT(&g_timx_pwmin_chy_handler, TIM_CHANNEL_1);
    HAL_TIM_IC_Start_IT(&g_timx_pwmin_chy_handler, TIM_CHANNEL_2);
}
//7重啟PWM輸入模式
void atim_timx_pwmin_chy_restart(void)                     /* 高級(jí)定時(shí)器 重啟PWM輸入模式檢測(cè) */
{
    //7.1 關(guān)閉中斷
    sys_intx_disable();              //關(guān)閉中斷
    
    //7.2狀態(tài)和分頻系數(shù)清零
    g_timxchy_pwmin_sta = 0;         //清零狀態(tài)
    g_timxchy_pwmin_psc = 0;         //分頻系數(shù)清零
    
    //7.2設(shè)置最大計(jì)數(shù)頻率,得到最好的精度,計(jì)數(shù)器值清零
    __HAL_TIM_SET_PRESCALER(&g_timx_pwmin_chy_handler,0); //以最大的計(jì)數(shù)頻率采集,以得到最好的精度 
    __HAL_TIM_SET_COUNTER(&g_timx_pwmin_chy_handler,0);   //計(jì)數(shù)器清零
    
    //7.3 使能通道1捕獲中斷、使能溢出中斷、使能定時(shí)器
    __HAL_TIM_ENABLE_IT(&g_timx_pwmin_chy_handler,TIM_IT_CC1);    //使能通道1捕獲中斷
    __HAL_TIM_ENABLE_IT(&g_timx_pwmin_chy_handler,TIM_IT_UPDATE); //使能溢出中斷
    __HAL_TIM_ENABLE(&g_timx_pwmin_chy_handler);                  //使能定時(shí)器
    
    //7.4清零捕獲/比較中斷標(biāo)志、更新中斷標(biāo)志
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler,TIM_FLAG_CC1);  //清零捕獲/比較1中斷標(biāo)志
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler,TIM_FLAG_CC2);  //清零捕獲/比較2中斷標(biāo)志
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler,TIM_FLAG_UPDATE);//清零更新中斷標(biāo)志
    
    //7.5打開(kāi)中斷
    sys_intx_enable();
    
}

/**
 * @brief       定時(shí)器TIMX 通道Y PWM輸入模式 中斷處理函數(shù)
 * @note
 *              因?yàn)門IM1/TIM8等有多個(gè)中斷服務(wù)函數(shù),而TIM2~5/TIM12/TIM15等普通定時(shí)器只有1個(gè)中斷服務(wù)
 *              函數(shù),為了更好的兼容,我們對(duì)中斷處理統(tǒng)一放到atim_timx_pwin_chy_process函數(shù)里面進(jìn)行處理
 *
 * @param       無(wú)
 * @retval      無(wú)
 */
//10 統(tǒng)一中斷處理函數(shù)
static void atim_timx_pwmin_chy_process(void)
{
    //10.1啟動(dòng)入口檢測(cè)
    static uint8_t sflag = 0;
    //10.2 檢測(cè)PWM輸入狀態(tài)
    if(g_timxchy_pwmin_sta)               //若已輸入
    {
        //分屏系數(shù)清零,清零捕獲/比較標(biāo)志,清零更新中斷標(biāo)志,計(jì)數(shù)器清零
        g_timxchy_pwmin_psc = 0;
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1);           /* 清零捕獲/比較1中斷標(biāo)志 */
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC2);           /* 清零捕獲/比較2中斷標(biāo)志 */
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE);        /* 清零更新中斷標(biāo)志 */
        __HAL_TIM_SET_COUNTER(&g_timx_pwmin_chy_handler, 0);                     /* 計(jì)數(shù)器清零 */
        return;
    
    }
    //10.3檢測(cè)是否發(fā)生溢出中斷
    if(__HAL_TIM_GET_FLAG(&g_timx_pwmin_chy_handler,TIM_FLAG_UPDATE))  //若發(fā)生溢出中斷
    {
        //清除溢出中斷標(biāo)志
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE);        /* 清零溢出中斷標(biāo)志 */
        //檢測(cè)是否發(fā)生周期性捕獲中斷
        if(__HAL_TIM_GET_FLAG(&g_timx_pwmin_chy_handler,TIM_FLAG_CC1)== 0) //若沒(méi)有發(fā)生周期性捕獲中斷,且捕獲未完成
        {
            //PWM輸入檢測(cè)標(biāo)志置0
            sflag= 0;
            if(g_timxchy_pwmin_psc == 0)  //從0到1
            {
                g_timxchy_pwmin_psc++;
            }
            else
            {
                if(g_timxchy_pwmin_psc == 65535)               /* 已經(jīng)最大了,可能是無(wú)輸入狀態(tài) */
                {
                    g_timxchy_pwmin_psc = 0;                    /* 重新恢復(fù)不分頻 */
                }  
                else if (g_timxchy_pwmin_psc > 32767)           /* 不能倍增了 */
                {
                    g_timxchy_pwmin_psc = 65535;                /* 直接等于最大分頻系數(shù) */
                }
                else
                {
                    g_timxchy_pwmin_psc += g_timxchy_pwmin_psc; /* 倍增 */
                }                
            }
            __HAL_TIM_SET_PRESCALER(&g_timx_pwmin_chy_handler, g_timxchy_pwmin_psc); /* 設(shè)置定時(shí)器預(yù)分頻系數(shù) */
            __HAL_TIM_SET_COUNTER(&g_timx_pwmin_chy_handler, 0);                     /* 計(jì)數(shù)器清零 */
            __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1);           /* 清零捕獲/比較1中斷標(biāo)志 */
            __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC2);           /* 清零捕獲/比較2中斷標(biāo)志 */
            __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE);        /* 清零更新中斷標(biāo)志 */
            return ;
            
        }
    
    }
    //10.4檢測(cè)到是采集到更新捕獲中斷
    if(sflag == 0)      //第一次采集到更新捕獲中斷
    {
         if (__HAL_TIM_GET_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1))   /* 檢測(cè)到了第一次周期捕獲中斷 */
        { 
            sflag = 1;              /* 標(biāo)記第一次周期已經(jīng)捕獲, 第二次周期捕獲可以開(kāi)始了 */
        }
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1);           /* 清零捕獲/比較1中斷標(biāo)志 */
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC2);           /* 清零捕獲/比較2中斷標(biāo)志 */
        __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE);        /* 清零更新中斷標(biāo)志 */
        return;
    
    }
    //10.5 如果還沒(méi)有成功捕獲
    if(g_timxchy_pwmin_sta == 0)
    {
        if (__HAL_TIM_GET_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1))   /* 檢測(cè)到了周期捕獲中斷 */
        { 
             g_timxchy_pwmin_hval = HAL_TIM_ReadCapturedValue(&g_timx_pwmin_chy_handler, TIM_CHANNEL_2) + 1;  /* PWM的高電平脈寬捕獲值 */
             g_timxchy_pwmin_cval = HAL_TIM_ReadCapturedValue(&g_timx_pwmin_chy_handler, TIM_CHANNEL_1) + 1;  /* PWM的周期寬度捕獲值 */
            if(g_timxchy_pwmin_hval<g_timxchy_pwmin_cval)         //高電平款比小于周期性寬
            {
                g_timxchy_pwmin_sta =1;                           //標(biāo)記捕獲成功
                g_timxchy_pwmin_psc = ATIM_TIMX_PWMIN->PSC;       //獲取PWM輸入分頻系數(shù)
               if (g_timxchy_pwmin_psc == 0)                   /* 分頻系數(shù)為0的時(shí)候, 修正讀取數(shù)據(jù) */
                {
                    g_timxchy_pwmin_hval++;                     /* 修正系數(shù)為1, 加1 */
                    g_timxchy_pwmin_cval++;                     /* 修正系數(shù)為1, 加1 */
                }

                sflag = 0;
                
                //每次捕獲成功后停止捕獲,避免頻繁中斷影響系統(tǒng)正常運(yùn)行
                ATIM_TIMX_PWMIN->CR1 &= ~(1<< 0);                //關(guān)閉定時(shí)器TIMX
                __HAL_TIM_DISABLE_IT(&g_timx_pwmin_chy_handler,TIM_IT_CC1);      //失能通道1捕獲中斷
                __HAL_TIM_DISABLE_IT(&g_timx_pwmin_chy_handler,TIM_IT_CC2);      //失能通道2捕獲中斷
                __HAL_TIM_DISABLE_IT(&g_timx_pwmin_chy_handler,TIM_IT_UPDATE);   //使能溢出中斷
                
               __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1);    /* 清零捕獲/比較1中斷標(biāo)志 */
               __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC2);    /* 清零捕獲/比較2中斷標(biāo)志 */
               __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE); /* 清零更新中斷標(biāo)志 */
            }
            else
            {
                atim_timx_pwmin_chy_restart();
            }
        }
    }
        /* 清除捕獲/比較1中斷標(biāo)志\捕獲/比較2中斷標(biāo)志/更新中斷標(biāo)志 */
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC1);
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_CC2);
    __HAL_TIM_CLEAR_FLAG(&g_timx_pwmin_chy_handler, TIM_FLAG_UPDATE);
}
/**
 * @brief       定時(shí)器TIMX 更新/溢出 中斷服務(wù)函數(shù)
 *   @note      TIM1/TIM8的這個(gè)函數(shù)僅用于更新/溢出中斷服務(wù),捕獲在另外一個(gè)函數(shù)!
 *              其他普通定時(shí)器則更新/溢出/捕獲,都在這個(gè)函數(shù)里面處理!
 * @param       無(wú)
 * @retval      無(wú)
 */
//8.更新/溢出中斷服務(wù)
void ATIM_TIMX_PWMIN_IRQHandler(void)
{
    atim_timx_pwmin_chy_process();
}
/**
 * @brief       定時(shí)器TIMX 輸入捕獲 中斷服務(wù)函數(shù)
 *   @note      僅TIM1/TIM8有這個(gè)函數(shù),其他普通定時(shí)器沒(méi)有這個(gè)中斷服務(wù)函數(shù)!
 * @param       無(wú)
 * @retval      無(wú)
 */
//9.捕獲中斷服務(wù)
void ATIM_TIMX_PWMIN_CC_IRQHandler(void)
{
    atim_timx_pwmin_chy_process();
}

2.2 atim.h

#ifndef __ATIM_H
#define __ATIM_H

#include "./SYSTEM/sys/sys.h"

/* TIMX 輸出比較模式 定義 
 * 這里通過(guò)TIM8的輸出比較模式,控制PC6,PC7,PC8,PC9輸出4路PWM,占空比50%,并且每一路PWM之間的相位差為25%
 * 修改CCRx可以修改相位.
 * 默認(rèn)是針對(duì)TIM8
 * 注意: 通過(guò)修改這些宏定義,可以支持TIM1/TIM8任意一個(gè)定時(shí)器,任意一個(gè)IO口使用輸出比較模式,輸出PWM
 */
#define ATIM_TIMX_COMP_CH1_GPIO_PORT            GPIOC
#define ATIM_TIMX_COMP_CH1_GPIO_PIN             GPIO_PIN_6
#define ATIM_TIMX_COMP_CH1_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   /* PC口時(shí)鐘使能 */

#define ATIM_TIMX_COMP_CH2_GPIO_PORT            GPIOC
#define ATIM_TIMX_COMP_CH2_GPIO_PIN             GPIO_PIN_7
#define ATIM_TIMX_COMP_CH2_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   /* PC口時(shí)鐘使能 */

#define ATIM_TIMX_COMP_CH3_GPIO_PORT            GPIOC
#define ATIM_TIMX_COMP_CH3_GPIO_PIN             GPIO_PIN_8
#define ATIM_TIMX_COMP_CH3_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   /* PC口時(shí)鐘使能 */

#define ATIM_TIMX_COMP_CH4_GPIO_PORT            GPIOC
#define ATIM_TIMX_COMP_CH4_GPIO_PIN             GPIO_PIN_9
#define ATIM_TIMX_COMP_CH4_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   /* PC口時(shí)鐘使能 */

#define ATIM_TIMX_COMP                          TIM8
#define ATIM_TIMX_COMP_CH1_CCRX                 TIM8->CCR1                                  /* 通道1的輸出比較寄存器 */
#define ATIM_TIMX_COMP_CH2_CCRX                 TIM8->CCR2                                  /* 通道1的輸出比較寄存器 */
#define ATIM_TIMX_COMP_CH3_CCRX                 TIM8->CCR3                                  /* 通道1的輸出比較寄存器 */
#define ATIM_TIMX_COMP_CH4_CCRX                 TIM8->CCR4                                  /* 通道1的輸出比較寄存器 */
#define ATIM_TIMX_COMP_CLK_ENABLE()             do{ __HAL_RCC_TIM8_CLK_ENABLE(); }while(0)  /* TIM8 時(shí)鐘使能 */

void atim_timx_com_pwm_init(uint16_t arr, uint16_t psc);   /* 高級(jí)定時(shí)器 輸出比較模式輸出PWM 初始化函數(shù) */


/* TIMX 互補(bǔ)輸出模式 定義 
 * 這里設(shè)置互補(bǔ)輸出相關(guān)硬件配置, CHY即正常輸出, CHYN即互補(bǔ)輸出
 * 修改CCRx可以修改占空比.
 * 默認(rèn)是針對(duì)TIM1
 * 注意: 通過(guò)修改這些宏定義,可以支持TIM1/TIM8定時(shí)器, 任意一個(gè)IO口輸出互補(bǔ)PWM(前提是必須有互補(bǔ)輸出功能)
 */

/* 輸出通道引腳 */
#define ATIM_TIMX_CPLM_CHY_GPIO_PORT            GPIOE
#define ATIM_TIMX_CPLM_CHY_GPIO_PIN             GPIO_PIN_9
#define ATIM_TIMX_CPLM_CHY_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口時(shí)鐘使能 */

/* 互補(bǔ)通道引腳 */
#define ATIM_TIMX_CPLM_CHYN_GPIO_PORT            GPIOE
#define ATIM_TIMX_CPLM_CHYN_GPIO_PIN             GPIO_PIN_8
#define ATIM_TIMX_CPLM_CHYN_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口時(shí)鐘使能 */

/* 剎車輸入引腳 */
#define ATIM_TIMX_CPLM_BKIN_GPIO_PORT            GPIOE
#define ATIM_TIMX_CPLM_BKIN_GPIO_PIN             GPIO_PIN_15
#define ATIM_TIMX_CPLM_BKIN_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口時(shí)鐘使能 */

/* TIMX REMAP設(shè)置
 * 因?yàn)镻E8/PE9/PE15, 默認(rèn)并不是TIM1的復(fù)用功能腳, 必須開(kāi)啟完全重映射, 才可以將: TIM1_CH1->PE9; TIM1_CH1N->PE8; TIM1_BKIN->PE15;
 * 這樣, PE8/PE9/PE15, 才能用作TIM1的CH1N/CH1/BKIN功能.
 * 因此, 必須實(shí)現(xiàn)ATIM_TIMX_CPLM_CHYN_GPIO_AF, 
 * 如果我們使用默認(rèn)的復(fù)用功能輸出, 則不用設(shè)置重映射, 是可以不需要該函數(shù)的! 根據(jù)具體需要來(lái)實(shí)現(xiàn).
 */
#define ATIM_TIMX_CPLM_CHY_GPIO_AF               GPIO_AF1_TIM1

/*互補(bǔ)輸出使用定時(shí)器*/
#define ATIM_TIMX_CPLM                          TIM1
#define ATIM_TIMX_CPLM_CHY                      TIM_CHANNEL_1                               /* 通道Y,  1<= Y <=4 */
#define ATIM_TIMX_CPLM_CHY_CCRX                 ATIM_TIMX_CPLM->CCR1                        /* 通道Y的輸出比較寄存器 */
#define ATIM_TIMX_CPLM_CHY_CLK_ENABLE()         do{ __HAL_RCC_TIM1_CLK_ENABLE(); }while(0)  /* TIM1 時(shí)鐘使能 */

void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc);   /* 高級(jí)定時(shí)器 互補(bǔ)輸出 初始化函數(shù) */
void atim_timx_cplm_pwm_set(uint16_t ccr, uint8_t dtg);   /* 高級(jí)定時(shí)器 互補(bǔ)輸出 設(shè)置比較值、死區(qū)時(shí)間 */

/* TIMX PWM輸入模式 定義 
 * 這里的輸入捕獲使用定時(shí)器TIM1_CH1,捕獲WK_UP按鍵的輸入
 * 默認(rèn)是針對(duì)TIM1/TIM8等高級(jí)定時(shí)器
 * 注意: 通過(guò)修改這幾個(gè)宏定義,可以支持TIM1~TIM8任意一個(gè)定時(shí)器的通道1/通道2
 */
#define ATIM_TIMX_PWMIN_CHY_GPIO_PORT           GPIOC
#define ATIM_TIMX_PWMIN_CHY_GPIO_PIN            GPIO_PIN_6
#define ATIM_TIMX_PWMIN_CHY_GPIO_AF             GPIO_AF3_TIM8
#define ATIM_TIMX_PWMIN_CHY_GPIO_CLK_ENABLE()   do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)   /* PC口時(shí)鐘使能 */

#define ATIM_TIMX_PWMIN                          TIM8
#define ATIM_TIMX_PWMIN_IRQn                     TIM8_UP_TIM13_IRQn
#define ATIM_TIMX_PWMIN_IRQHandler               TIM8_UP_TIM13_IRQHandler
#define ATIM_TIMX_PWMIN_CHY                      TIM_CHANNEL_1                                /* 通道Y,1<=Y<=2 */
#define ATIM_TIMX_PWMIN_CHY_CLK_ENABLE()         do{ __HAL_RCC_TIM8_CLK_ENABLE(); }while(0)   /* TIM8 時(shí)鐘使能 */

 /* TIM1 / TIM8 有獨(dú)立的捕獲中斷服務(wù)函數(shù),需要單獨(dú)定義,對(duì)于TIM2~5等,則不需要以下定義 */
#define ATIM_TIMX_PWMIN_CC_IRQn                     TIM8_CC_IRQn
#define ATIM_TIMX_PWMIN_CC_IRQHandler               TIM8_CC_IRQHandler

void atim_timx_pwmin_chy_init(void);                        /* 高級(jí)定時(shí)器 PWM輸入模式初始化 */
void atim_timx_pwmin_chy_restart(void);                     /* 高級(jí)定時(shí)器 重啟PWM輸入模式檢測(cè) */

#endif

2.3main.c


#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/TIMER/gtim.h"


int main01(void)
{
    uint8_t key = 0;
    uint8_t t = 0;
    GPIO_InitTypeDef gpio_init_struct;
    
    HAL_Init();                                 /* 初始化HAL庫(kù) */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 設(shè)置時(shí)鐘,168Mhz */
    delay_init(168);                            /* 延時(shí)初始化 */
    usart_init(115200);                         /* 串口初始化為115200 */
    led_init();                                 /* 初始化LED */
    key_init();                                 /* 初始化按鍵 */
    
    /* 將 LED1 引腳設(shè)置為輸入模式, 避免和PC6沖突 */
    gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引腳 */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;                /* 設(shè)置為輸入 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速模式 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引腳 */
    
    atim_timx_npwm_chy_init(10000 - 1, 8400 - 1);           /* 20Khz的計(jì)數(shù)頻率,2Hz的PWM頻率. */

    ATIM_TIMX_NPWM_CHY_CCRX = 5000; /* 設(shè)置PWM占空比,50%,這樣可以控制每一個(gè)PWM周期,LED1(GREEN)
                                     * 有一半時(shí)間是亮的,一半時(shí)間是滅的,LED1亮滅一次,表示一個(gè)PWM波
                                     */
    atim_timx_npwm_chy_set(5);      /* 輸出5個(gè)PWM波(控制LED1(GREEN)閃爍5次) */
    
    while (1)
    {
       key = key_scan(0);

        if (key == KEY0_PRES)           /* KEY0按下 */
        {
            atim_timx_npwm_chy_set(5);  /* 輸出5個(gè)PWM波(控制TIM8_CH1, 即PC6輸出5個(gè)脈沖) */
        }

        t++;
        delay_ms(10);

        if (t > 50)                     /* 控制LED0閃爍, 提示程序運(yùn)行狀態(tài) */
        {
            t = 0;
            LED0_TOGGLE();
        }
    }
}

int main02(void)
{
    uint8_t t = 0;
    GPIO_InitTypeDef gpio_init_struct;
    
    HAL_Init();                                 /* 初始化HAL庫(kù) */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 設(shè)置時(shí)鐘,168Mhz */
    delay_init(168);                            /* 延時(shí)初始化 */
    usart_init(115200);                         /* 串口初始化為115200 */
    led_init();                                 /* 初始化LED */
    key_init();                                 /* 初始化按鍵 */
    
    /* 將 LED1 引腳設(shè)置為輸入模式, 避免和PC6沖突 */
    gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1引腳 */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;                /* 設(shè)置為輸入 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速模式 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* 初始化LED1引腳 */
    
    atim_timx_npwm_chy_init(10000- 1, 168 - 1);           /* 1Mhz的計(jì)數(shù)頻率,1Khz的PWM周期. */

    ATIM_TIMX_COMP_CH1_CCRX = 250-1;  /* 通道1 相位25%*/
    ATIM_TIMX_COMP_CH2_CCRX = 500-1;  /* 通道1 相位50%*/
    ATIM_TIMX_COMP_CH3_CCRX = 750-1;  /* 通道1 相位75%*/
    ATIM_TIMX_COMP_CH4_CCRX = 1000-1; /* 通道1 相位100%*/
                                    

    while (1)
    {

        t++;
        delay_ms(10);

        if (t > 50)                     /* 控制LED0閃爍, 提示程序運(yùn)行狀態(tài) */
        {
            t = 0;
            LED0_TOGGLE();
        }
    }
}
int main03(void)
{
    uint8_t t = 0;
    
    HAL_Init();                                 /* 初始化HAL庫(kù) */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 設(shè)置時(shí)鐘,168Mhz */
    delay_init(168);                            /* 延時(shí)初始化 */
    usart_init(115200);                         /* 串口初始化為115200 */
    led_init();                                 /* 初始化LED */

    atim_timx_cplm_pwm_init(1000- 1, 168 - 1);  /* 1Mhz的計(jì)數(shù)頻率,1Khz波形輸出. */
    atim_timx_cplm_pwm_set(300,250);            /*占空比為7:3,死區(qū)時(shí)間  100*tDTS*/
                                    

    while (1)
    {

        t++;
        delay_ms(10);

        if (t > 50)                     /* 控制LED0閃爍, 提示程序運(yùn)行狀態(tài) */
        {
            t = 0;
            LED0_TOGGLE();
        }
    }
}

extern uint16_t g_timxchy_pwmin_psc;    /* PWM輸入狀態(tài) */
extern uint16_t g_timxchy_pwmin_sta;    /* PWM輸入狀態(tài) */
extern uint32_t g_timxchy_pwmin_hval;   /* PWM的高電平脈寬 */
extern uint32_t g_timxchy_pwmin_cval;   /* PWM的周期寬度 */

int main04(void)
{
    uint8_t t = 0;
    double ht,ct,f,tpsc;
    
    HAL_Init();                                 /* 初始化HAL庫(kù) */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 設(shè)置時(shí)鐘,168Mhz */
    delay_init(168);                            /* 延時(shí)初始化 */
    usart_init(115200);                         /* 串口初始化為115200 */
    led_init();                                 /* 初始化LED */

    gtim_timx_pwm_chy_init(10- 1, 84 - 1);       /* 1Mhz的計(jì)數(shù)頻率,100Khz波形輸出. */
    atim_timx_pwmin_chy_init();                  /* 初始化PWM輸入捕獲 */
    
    GTIM_TIMX_PWM_CHY_CCRX = 2;                 /* 低電平寬度20,高電平寬度80 */

    while (1)
    {

        t++;
        delay_ms(10);

        if (t > 20)                     /* 控制LED0閃爍, 提示程序運(yùn)行狀態(tài) */
        {
            if(g_timxchy_pwmin_sta)
            {
               printf("\r\n");                                     /* 輸出空,另起一行 */
                printf("PWM PSC  :%d\r\n", g_timxchy_pwmin_psc);    /* 打印分頻系數(shù) */
                printf("PWM Hight:%d\r\n", g_timxchy_pwmin_hval);   /* 打印高電平脈寬 */
                printf("PWM Cycle:%d\r\n", g_timxchy_pwmin_cval);   /* 打印周期 */
                tpsc = ((double)g_timxchy_pwmin_psc + 1) / 168;     /* 得到PWM采樣時(shí)鐘周期時(shí)間 */
                ht = g_timxchy_pwmin_hval * tpsc;                   /* 計(jì)算高電平時(shí)間 */
                ct = g_timxchy_pwmin_cval * tpsc;                   /* 計(jì)算周期長(zhǎng)度 */
                f = (1 / ct) * 1000000;                             /* 計(jì)算頻率 */
                printf("PWM Hight time:%.3fus\r\n", ht);            /* 打印高電平脈寬長(zhǎng)度 */
                printf("PWM Cycle time:%.3fus\r\n", ct);            /* 打印周期時(shí)間長(zhǎng)度 */
                printf("PWM Frequency :%.3fHz\r\n", f);             /* 打印頻率 */
                atim_timx_pwmin_chy_restart();                      /* 重啟PWM輸入檢測(cè) */
            }
            t = 0;
            LED0_TOGGLE();
        }
    }
}



到了這里,關(guān)于STM32——高級(jí)定時(shí)器輸出比較模式實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32筆記——定時(shí)器輸出比較功能(產(chǎn)生PWM波)

    STM32筆記——定時(shí)器輸出比較功能(產(chǎn)生PWM波)

    目錄 一、概述 二、PWM簡(jiǎn)單介紹 ?三、通用定時(shí)器輸出比較 3.1 輸出比較簡(jiǎn)介 3.2 輸出比較通道 3.3 產(chǎn)生PWM的過(guò)程 四、實(shí)驗(yàn)硬件介紹及PWM模塊程序 4.1 舵機(jī)簡(jiǎn)介 4.2 直流電機(jī)及驅(qū)動(dòng)芯片TB6612 ?4.3 PWM模塊驅(qū)動(dòng)程序 ????????主要介紹通用定時(shí)器輸出比較功能,在GPIO口輸出PWM來(lái)控

    2024年02月13日
    瀏覽(36)
  • HAL庫(kù)STM32常用外設(shè)教程(五)—— 定時(shí)器 輸出比較

    HAL庫(kù)STM32常用外設(shè)教程(五)—— 定時(shí)器 輸出比較

    有關(guān)于定時(shí)器 輸出PWM功能 不了解的可以看這篇文章 :HAL庫(kù)STM32常用外設(shè)教程(一)—— 定時(shí)器 輸出PWM 有關(guān)于定時(shí)器 定時(shí)功能 不了解的可以看這篇文章 :HAL庫(kù)STM32常用外設(shè)教程(四)—— 定時(shí)器 基本定時(shí) 1、STM32F407ZGT6 2、STM32CubeMx軟件 3、keil5 內(nèi)容簡(jiǎn)述: 通篇文章將涉及以

    2024年03月27日
    瀏覽(19)
  • STM32CubeMX教程8 TIM 通用定時(shí)器 - 輸出比較

    開(kāi)發(fā)板(STM32F407G-DISC1) STM32CubeMX軟件(Version 6.10.0) keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動(dòng) 邏輯分析儀nanoDLA 使用STM32CubeMX軟件配置STM32F407 通用定時(shí)器的輸出比較通道 ,并將其輸出到四個(gè)LED燈引腳實(shí)現(xiàn)LED燈流水燈效果 STM32F407的定時(shí)器通道均可以實(shí)現(xiàn)輸出比較功能, 輸出比較功

    2024年02月03日
    瀏覽(28)
  • STM32使用高級(jí)定時(shí)器輸出互補(bǔ)pwm波

    STM32使用高級(jí)定時(shí)器輸出互補(bǔ)pwm波

    最近做的一個(gè)項(xiàng)目用到stm32,網(wǎng)上查了很多資料,也踩了很多坑,這里記錄一下配置的步驟和說(shuō)明 硬件使用的是stm32h750vbt6; 軟件用到了stm32cubemx和keil5; 打開(kāi)Debug模式方便調(diào)試,可以忽略,不影響代碼運(yùn)行 在用cube配置時(shí)鐘源時(shí),有下面三個(gè)選項(xiàng) Disable(禁用) BYPASS Clock Sou

    2024年02月16日
    瀏覽(20)
  • STM32高級(jí)定時(shí)器輸出指定數(shù)量PWM(STM32CubeMx配置)

    STM32高級(jí)定時(shí)器輸出指定數(shù)量PWM(STM32CubeMx配置)

    高級(jí)定時(shí)器中有一個(gè)重復(fù)計(jì)數(shù)器,本實(shí)驗(yàn)輸出指定個(gè)數(shù)PWM就是利用了重復(fù)計(jì)數(shù)器的特性,先來(lái)看看重復(fù)計(jì)數(shù)器的特性是什么: 計(jì)數(shù)器每次上溢或下溢都能使重復(fù)計(jì)數(shù)器減1,減到0時(shí),再發(fā)生一次溢出就會(huì)產(chǎn)生更新事件 這是什么意思呢,這里舉個(gè)例子比如說(shuō)我設(shè)定重復(fù)計(jì)數(shù)器的

    2024年02月02日
    瀏覽(23)
  • STM32實(shí)戰(zhàn)-高級(jí)定時(shí)器帶死區(qū)的互補(bǔ)PWM輸出

    STM32實(shí)戰(zhàn)-高級(jí)定時(shí)器帶死區(qū)的互補(bǔ)PWM輸出

    前言: 平時(shí)我們?cè)O(shè)計(jì)點(diǎn)擊驅(qū)動(dòng)電路時(shí),一般會(huì)采用npn和pnp三極管,來(lái)控制電機(jī)的導(dǎo)通和關(guān)閉,但是三級(jí)管內(nèi)部自帶電容,斷電后不會(huì)立馬斷掉,會(huì)經(jīng)過(guò)很小的一段時(shí)間才會(huì)放電完畢,這時(shí)候要留有死區(qū)給電容放電,這就有了互補(bǔ)pwm波。 ? 同時(shí),當(dāng)電機(jī)出現(xiàn)故障,如果利用軟

    2024年02月08日
    瀏覽(21)
  • STM32單片機(jī)(六)TIM定時(shí)器 -> 第三節(jié):TIM輸出比較

    STM32單片機(jī)(六)TIM定時(shí)器 -> 第三節(jié):TIM輸出比較

    ?? 專欄簡(jiǎn)介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過(guò)程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開(kāi)始學(xué)習(xí)入門單片機(jī),且有一定C語(yǔ)言基礎(chǔ)的的童鞋

    2024年02月09日
    瀏覽(30)
  • STM32——高級(jí)定時(shí)器輸出指定個(gè)數(shù)PWM波原理及實(shí)戰(zhàn)

    STM32——高級(jí)定時(shí)器輸出指定個(gè)數(shù)PWM波原理及實(shí)戰(zhàn)

    相比于通用定時(shí)器特性: 1)重復(fù)計(jì)數(shù)器 2)死區(qū)時(shí)間帶可編程的互補(bǔ)輸出 3)斷路輸入,用于將定時(shí)器的輸出信號(hào)置于用戶可選的安全配置中 1,配置定時(shí)器基礎(chǔ)工作參數(shù) HAL_TIM_PWM_Init() 2,定時(shí)器PWM輸出MSP初始化 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比較值等

    2024年01月16日
    瀏覽(21)
  • STM32外設(shè)之TIM定時(shí)器使用及輸出比較模式PWM生成,PWM頻率和占空比計(jì)算,文末有固件庫(kù)TIM驅(qū)動(dòng)文件的函數(shù)講解

    STM32外設(shè)之TIM定時(shí)器使用及輸出比較模式PWM生成,PWM頻率和占空比計(jì)算,文末有固件庫(kù)TIM驅(qū)動(dòng)文件的函數(shù)講解

    過(guò)來(lái)人的經(jīng)驗(yàn)分享: TIM定時(shí)器在我們學(xué)習(xí)STM32的過(guò)程中是一個(gè)重要且稍微有點(diǎn)難度的外設(shè)了,就拿從學(xué)校里做的項(xiàng)目來(lái)說(shuō)用到的也是一些基本的外設(shè)配置和傳感器等等。TIM作為外設(shè)中稍微有點(diǎn)難度的外設(shè)相當(dāng)關(guān)鍵,學(xué)好TIM,對(duì)以后學(xué)習(xí)單片機(jī)開(kāi)發(fā)也有很大幫助。 定時(shí)器是stm3

    2024年02月07日
    瀏覽(24)
  • STM32學(xué)習(xí)筆記(4) 高級(jí)定時(shí)器-兩路互補(bǔ)的PWM輸出(帶死區(qū)和剎車控制)

    STM32學(xué)習(xí)筆記(4) 高級(jí)定時(shí)器-兩路互補(bǔ)的PWM輸出(帶死區(qū)和剎車控制)

    目錄 1.實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)效果 3.理論部分 3.1時(shí)鐘源 3.2時(shí)基單元 3.3輸入捕獲 4.程序流程 4.1GPIO初始化結(jié)構(gòu)體 4.2時(shí)基初始化結(jié)構(gòu)體 4.3輸出比較結(jié)構(gòu)體 4.4剎車和死區(qū)結(jié)構(gòu)體的初始化 5.程序源碼 使用高級(jí)定時(shí)器,輸出兩路互補(bǔ)的PWM輸出,需要有帶死區(qū)和不帶死區(qū)兩種情況 圖1:不帶

    2024年02月13日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包