国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

c語言實現STM32F1多路相位、占空比可調PWM

[復制鏈接]
樓主
zloop 發表于 2020-1-5 23:55:28 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
主要是用到定時器的主從模式,舉例:T2的OC1 和T5的OC4輸出相位、占空比可調的兩路PWM

定時器T2作為主定時器  OC1輸出10%的占空比,定時器T2 的OC2用來調整相位,暫定輸出30%的占空比,并設置T2的OC2為輸出觸發信號。主要設置代碼:        
        TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主模式使能,TIMx->SMCR ---- MSM
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC2Ref);//主模式選擇,TIMx->CR2  MMS

T5作為從定時器,任意選擇一路PWM輸出,并設置好占空比以OC4為例。并選擇觸發源,從模式選擇復位模式,主要配置代碼:
        TIM_SelectInputTrigger(TIM5,TIM_TS_ITR0);//觸發選擇,TIMx_SMCR --  TS
        TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Reset );//從模式選擇 TIMx_SMCR --  SMS

通過T2的OC2就可以調整T2的OC1和T5的OC4之間的相位差。
c語言實現STM32F1多路相位、占空比可調PWM image.png

  1. ////--------------  TIM2 -----------------------
  2. //APB1分頻系數為2,APB1的時鐘為36M,TIM2-7為其2倍=72M
  3. //Tout= ((arr+1)*(psc+1))/Tclk;
  4. //arr 自動裝載值,PSC 時鐘預分頻數
  5. void Time2Init(u16 period,u16 psc)
  6. {
  7.                 TIM_TimeBaseInitTypeDef  TIMStruct;
  8.                 NVIC_InitTypeDef  NVIC_InitStruct;       
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能

  10. //        //TIM2 初始化
  11.         TIMStruct.TIM_Period=period;//自動重載計數周期的值
  12.         TIMStruct.TIM_Prescaler=psc;//預分頻值,T2頻率=FclkSYS/psc
  13.         TIMStruct.TIM_ClockDivision=TIM_CKD_DIV1;//CDK時鐘分頻因子
  14.         TIMStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
  15.         TIM_TimeBaseInit(TIM2,&TIMStruct);//根據指定的參數初始化TIMx的時間基數單位
  16.                
  17. //        //中斷優先級
  18.                 //更新中斷中斷TIM_IT_Update, 比較中斷TIM_IT_CC
  19.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//允許更新中斷
  20.         NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
  21.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//搶占優先級
  22.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//從優先級
  23.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  24.         NVIC_Init(&NVIC_InitStruct);
  25.        
  26.                 //----主從配置
  27.         TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主模式使能,TIMx->SMCR ---- MSM
  28.         TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC2Ref);//主模式選擇,TIMx->CR2  MMS
  29.        
  30.        
  31.         //使能
  32.         TIM_Cmd(TIM2,ENABLE);
  33.         TIMs2.Instense=TIM2;
  34. }
  35. //CCER->CCxP = 0; PWM模式1的情況下TIMx->CRRx= 0;為低電平。TIMx->CRRx = TIMx->ARR;為高電平,TIMx->CRRx越大,正占空比越大。
  36. //CCER->CCxP = 1; PWM模式1的情況下TIMx->CRRx= 0;為高電平。TIMx->CRRx >= TIMx->ARR;為低電平,TIMx->CRRx越大,正占空比越小。
  37. //CCER->CCxP = 0; PWM模式2的情況下TIMx->CRRx= 0;為高電平。TIMx->CRRx = TIMx->ARR;為低電平,TIMx->CRRx越大,正占空比越小。
  38. //CCER->CCxP = 1; PWM模式2的情況下TIMx->CRRx= 0;為低電平。TIMx->CRRx >= TIMx->ARR;為高電平,TIMx->CRRx越大,正占空比越大。
  39. void Time2PWMInit(void)
  40. {
  41.         GPIO_InitTypeDef GPIO_InitStructure;
  42.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  43.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  44.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIMx外設
  45.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOB外設時鐘使能
  46.         //配置IO
  47.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH1
  48.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復用功能輸出
  49.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.         GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
  51.         //通道1
  52.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式       
  53.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  54.         TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
  55.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
  56.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
  57.         TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //根據指定的參數初始化外設TIMx
  58.         TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);   
  59.         TIM_SetCompare1(TIM2,100);
  60.         //通道2
  61.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式       
  62.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  63.         TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
  64.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
  65.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
  66.         TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根據指定的參數初始化外設TIMx
  67.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);   
  68.                 TIM_SetCompare2(TIM2,200);//初始值為0       
  69.        
  70.          TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的預裝載寄存器

  71. }

  72. void Time5Init(u16 period,u16 psc)
  73. {
  74.                 TIM_TimeBaseInitTypeDef  TIMStruct;
  75.                 NVIC_InitTypeDef  NVIC_InitStruct;       
  76.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //時鐘使能

  77. //        //TIM 初始化
  78.         TIMStruct.TIM_Period=period;//自動重載計數周期的值
  79.         TIMStruct.TIM_Prescaler=psc;//預分頻值,T2頻率=FclkSYS/psc
  80.         TIMStruct.TIM_ClockDivision=TIM_CKD_DIV1;//CDK時鐘分頻因子
  81.         TIMStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
  82.         TIM_TimeBaseInit(TIM5,&TIMStruct);//根據指定的參數初始化TIMx的時間基數單位
  83.                
  84. //        //中斷優先級
  85.                 //更新中斷中斷TIM_IT_Update, 比較中斷TIM_IT_CC
  86.         TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//允許更新中斷
  87.         NVIC_InitStruct.NVIC_IRQChannel=TIM5_IRQn;
  88.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//搶占優先級
  89.         NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//從優先級
  90.         NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  91.         NVIC_Init(&NVIC_InitStruct);
  92.        
  93.                 //----主從配置
  94.         TIM_SelectInputTrigger(TIM5,TIM_TS_ITR0);//觸發選擇,TIMx_SMCR --  TS
  95.         TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Reset );//從模式選擇 TIMx_SMCR --  SMS
  96.        
  97.         //使能
  98.         TIM_Cmd(TIM5,ENABLE);
  99.         TIMs5.Instense=TIM5;
  100. }
  101. void Time5PWMInit(void)
  102. {
  103.         GPIO_InitTypeDef GPIO_InitStructure;
  104.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  105.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  106.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIMx外設
  107.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOB外設時鐘使能
  108.         //配置IO
  109.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM_CH4
  110.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復用功能輸出
  111.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  112.         GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
  113.         //通道1

  114.         //通道4
  115.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式       
  116.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  117.         TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
  118.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
  119.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
  120.         TIM_OC4Init(TIM5, &TIM_OCInitStructure);  //根據指定的參數初始化外設TIMx
  121.         TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);   
  122.                 TIM_SetCompare4(TIM5,100);//初始值為0       
  123.        
  124.          TIM_ARRPreloadConfig(TIM5, ENABLE); //使能TIMx在ARR上的預裝載寄存器

  125. }
復制代碼


沙發
gkjswuser 發表于 2021-4-12 23:15:29 | 只看該作者
請問TIMs2和 TIMs5是什么呀?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 01:09

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表