久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: [零基礎學習STM32]第八講:定時器PWM實驗—呼吸燈 [打印本頁]

作者: kkhkbb    時間: 2018-3-14 13:28
標題: [零基礎學習STM32]第八講:定時器PWM實驗—呼吸燈
本帖最后由 kkhkbb 于 2018-3-15 09:12 編輯

一、 概述
1、 PWM簡介
      PWM即脈沖寬度調制,是一種模擬控制方式,其根據相應載荷的變化來調制晶體管基極或MOS管柵極的偏置,來實現晶體管或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恒定,是利用微處理器的數字信號對模擬電路進行控制的一種非常有效的技術。
      PWM的主要應用:在STM32中如調節屏幕亮度、音調等應用都可以通過PWM控制占空比進行實現。下面我們會為大家舉例介紹如何利用PWM控制LED的亮暗,以實現呼吸燈的效果。
2、PWM的工作原理
      脈寬調制基本原理:其控制方式就是對電路開關器件的通斷進行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。也就是在輸出波形的半個周期中產生多個脈沖,使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈沖的寬度進行調制,即可改變電路輸出電壓的大小,也可改變輸出頻率。
    (1)脈寬調制原理
      脈寬調制調制模式可以生產一個由TIMx_ARR寄存器確定頻率,由TIMx_CCRx確定占空比的信號。如下圖所示:
                          圖8_0脈寬調制原理示意圖
        圖中可知0到t2為一個周期時間,而占空比由CCRx值決定。一個周期時間可以由以下公式計算:
        其中:ARR為重新裝載值;PSC為預分頻系數;TCLK為定時器時鐘頻率。如本次實驗中TCLk為84M,選擇ARR為499,PSC為83,其一個周期為0.5ms。
   (2)脈寬調制原理
          PWM主要工作過程如下:

                             圖8_1 PWM工作過程示意圖
     PWM工作步驟解析:        
    a. CCR1捕獲比較值寄存器設置比較值,將其與當前值寄存器的值比較,要說明的是修改TIM_CCMR1寄存器的OC1M[2:0]位可控制       PWM模式,方法如下:
  • 110:PWM模式1——向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平(OC1REF=0),否則有效電平(OC1REF=1)。
  • 111:PWM模式2——在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平。
   b. 經過輸出控制器后,得到OC1ref電平還要經過一個選擇,其由TIMx_CCRE寄存器的CC1P位控制:輸入/捕獲1輸出極性。0:高 電平有效。1:低電平有效
   c. 選擇完成后經過輸出電路來輸出,輸出電路由TIM_xCCRE寄存器的CC1E位控制。
       控制方式為0:關閉  1:打開。

二、 實驗原理

       STM32的定時器有PWM功能,iCore3的三個LED都連接在定時器的輸出接口上,可以通過定時器的PWM輸出控制LED的亮度,從而實現呼吸燈的功能。硬件連接示意圖如下圖所示:
                        圖8_2  驅動示意圖

三、源代碼

1、主函數

  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         int i;
  17.         int brightness = 99;
  18.         pwm.initialize();
  19.         float temp = 0.0;
  20.         int data = 0;

  21.         //紅色LED燈循環由亮變暗,由暗變亮
  22.         while(1){
  23.                 for(i = 0;i < 1000000;i++);
  24.                 brightness ++;
  25.                 if(brightness == 100){
  26.                         brightness = 0;
  27.                 }

  28.                 temp = sin(PI / 99.0 * brightness) * 0.5 + 0.5;
  29.                 temp *= 499;
  30.                 data = (int)temp;

  31.                 pwm.set_compare(data);
  32.         }
  33. }
復制代碼
2.PWM初始化
   以下是TIM8初始化及PWM設置程序:
  1. /*
  2. * Name               : initialize
  3. * Description        : ---
  4. * Author             : ysloveivy.
  5. *
  6. * History
  7. * -------------------
  8. * Rev                : 0.00
  9. * Date               : 11/21/2015
  10. *
  11. * create.
  12. * -------------------
  13. */
  14. static int initialize(void)
  15. {  
  16.         GPIO_InitTypeDef           GPIO_InitStructure;
  17.         TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  18.         TIM_OCInitTypeDef          TIM_OCInitStructure;

  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);                       //開啟TIM8定時器的時鐘
  20.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);                     //開啟GPIOI的時鐘
  21.         GPIO_PinAFConfig(GPIOI,GPIO_PinSource5,GPIO_AF_TIM8);                     //PI5復用為TIM8
  22.         //GPIO初始化設置
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                              //模式設為復用
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  26.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                            //復用推挽輸出
  27.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  28.         GPIO_Init(GPIOI,&GPIO_InitStructure);
  29.         //TIM8初始化
  30.         TIM_TimeBaseStructure.TIM_Prescaler = 83;                                 //設置預分頻值
  31.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               //向上計數模式
  32.         TIM_TimeBaseStructure.TIM_Period = 499;                                   //自動重裝載值
  33.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
  34.        //設置時鐘分割           
  35.         TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);
  36.         //TIM8 CH1 LED_RED
  37.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                         //設置為PWM模式2
  38.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             //比較輸出使能
  39.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;                //互補輸出使能
  40.         TIM_OCInitStructure.TIM_Pulse = 0;                                        //設置待裝入捕獲比較寄存器的脈沖值
  41.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                  //當定時器的值小于脈沖值時,輸出低電平
  42.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  43.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  44.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  45.         TIM_OC1Init(TIM8, &TIM_OCInitStructure);

  46.         TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);                         //使能輸出比較預裝載

  47.         TIM_ARRPreloadConfig(TIM8,ENABLE);                                      //使能TIM8自動重裝載的預裝載寄存器允許位
  48.         TIM_Cmd(TIM8, ENABLE);                                                    //TIM8使能
  49.         TIM_CtrlPWMOutputs(TIM8, ENABLE);                                         //使能主輸出

  50.         return 0;
  51. }
復制代碼
3.修改占空比函數
  1. static int set_compare(int temp)
  2. {
  3.         TIM_SetCompare1(TIM8,temp);                                                      //修改占空比
  4.         return 0;
  5. }
復制代碼
4.小知識
   在上面程序中有一段函數為:
   GPIO_PinAFConfig(GPIOI,GPIO_PinSource5,GPIO_AF_TIM8);
   它的功能是將PI5復用為TIM8_CH1,初學者可能會問了為什么PI5可以復用為TIM8_CH1,其他引角可不可以。這就要借助該芯片的數據手冊了,芯片上眾多引角他們往往帶有自己特殊的使命,如以下從數據手冊上的截屏:
                  圖8_3 芯片引腳功能示意圖
      其在數據手冊的Pinouts and pin description——STM32F40xxx pin and ball definitions目錄下。前面六列為該芯片手冊包含的芯片類型,接下來第七列是引腳的名稱,第八列是引腳類型如可以輸入輸出的I/O口,第八列中有FT標識的引腳表示能承受5V電壓,第九列是注釋,第十列為可復用功能如PI5要復用為TIM8_CH1功能則可通過剛剛介紹的函數實現,第十一列為可重映射功能。
四、 實驗現象:
      iCore3 雙核心板紅色LED燈亮度從亮到暗,然后從暗到亮。
五、 代碼包下載鏈接


iCore3_8_PWM.rar

940.07 KB, 下載次數: 18, 下載積分: 黑幣 -5






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产黄色片视频 | 亚洲精品911 | 少妇精品| 夜间福利视频 | 国产精品一区二 | 久久精品视频免费 | 国产中文字幕在线 | www.夜夜| 欧美激情免费 | 久久久久久久久久国产精品 | 天天cao | 成人一区二区在线 | 国产精品毛片va一区二区三区 | 91青青草| 国产精品婷婷 | 午夜美女福利 | 成人香蕉网 | 中文字幕精品视频 | 夜夜嗨av一区二区三区网页 | 成人特级毛片 | 狠狠干2021 | 久久久综合视频 | 久久动态图 | www在线播放| 国产香蕉视频在线观看 | 特黄一级视频 | 欧美色噜噜 | 国产成人三级一区二区在线观看一 | 国产成人免费在线 | 国产欧美在线观看 | 日本伊人久久 | 国产伦精品一区二区三区视频黑人 | 看黄网站在线观看 | 日韩在线视频免费观看 | 国产区精品 | www黄色片| 日韩欧美大片 | 国产毛片毛片 | 97在线视频观看 | 国产成年妇视频 | 国产一区二区在线免费 |