娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月12日(星期四)

2020年06月12日 | STM32基于固件庫學習筆記(9)TM3產生PWM調LED亮度

發布者:Zhenai5201314 來源: eefocus關鍵字:STM32  固件庫  TM3  PWM  LED亮度 手機看文章 掃描二維碼
隨時隨地手機看文章

PWM

  脈沖寬度調制模式可以產生一個由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號,也就是說對脈沖寬度的控制。


  STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來產生 PWM 輸出。其中高級定時器 TIM1 和 TIM8 可以同時產生多達 7 路的 PWM 輸出。而通用定時器也能同時產生多達 4路的 PWM 輸出,這樣,STM32 最多可以同時產生 30 路 PWM 輸出! 


  在TIMx_CCMRx寄存器中的OCxM位寫入’110’(PWM模式1)或’111’(PWM模式2),能夠獨立地設置每個OCx輸出通道產生一路PWM。必須設置TIMx_CCMRx寄存OCxPE位以使能相應的預裝載寄存器,最后還要設置TIMx_CR1寄存器的ARPE位,(在向上計數或中心對稱模式中)使能自動重裝載的預裝載寄存器。


  僅當發生一個更新事件的時候,預裝載寄存器才能被傳送到影子寄存器,因此在計數器開始計數之前,必須通過設置TIMx_EGR寄存器中的UG位來初始化所有的寄存器。


  OCx的極性可以通過軟件在TIMx_CCER寄存器中的CCxP位設置,它可以設置為高電平有效或低電平有效。TIMx_CCER寄存器中的CCxE位控制OCx輸出使能。詳見TIMx_CCERx寄存器的描述。


  在PWM模式(模式1或模式2)下,TIMx_CNT和TIMx_CCRx始終在進行比較,(依據計數器的計數方向)以確定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。然而為了與OCREF_CLR的功能(在下一個PWM周期之前,ETR信號上的一個外部事件能夠清除OCxREF)一致,OCxREF信號只能在下述條件下產生:


  ● 當比較的結果改變,或通用定時器(TIMx)

  ● 當輸出比較模式(TIMx_CCMRx寄存器中的OCxM位)從“凍結”(無比較,OCxM=’000’)切換到某個PWM模式(OCxM=’110’或’111’)。


  這樣在運行中可以通過軟件強置PWM輸出。


  根據TIMx_CR1寄存器中CMS位的狀態,定時器能夠產生邊沿對齊的PWM信號或中央對齊的PWM信號。


PWM 邊沿對齊模式


向上計數配置

  當TIMx_CR1寄存器中的DIR位為低的時候執行向上計數。


  下面是一個PWM模式1的例子。當TIMx_CNT

  如果比較值為0,則OCxREF保持為’0’。 下圖為TIMx_ARR=8時邊沿對齊的PWM波形實例。


- 向下計數配置

  當TIMx_CR1寄存器的DIR位為高時執行向下計數。

  在PWM模式1,當TIMx_CNT>TIMx_CCRx時參考信號OCxREF為低,否則為高。如果TIMx_CCRx中的比較值大于TIMx_ARR中的自動重裝載值,則OCxREF保持為’1’。該模式下不能產生0%的PWM波形。


PWM 中央對齊模式

  當TIMx_CR1寄存器中的CMS位不為’00’時,為中央對齊模式(所有其他的配置OCxREF/OCx信號都有相同的作用)。根據不同的CMS位設置,比較標志可以在計數器向上計數時被置’1’、在計數器向下計數時被置’1’、或在計數器向上和向下計數時被置’1’。TIMx_CR1寄存器中的計數方向位(DIR)由硬件更新,不要用軟件修改它。


下圖給出了一些中央對齊的PWM波形的例子

 ● TIMx_ARR=8

 ● PWM模式1

 ● TIMx_CR1寄存器中的CMS=01,在中央對齊模式1時,當計數器向下計數時設置比較標志。


使用中央對齊模式的提示:

● 進入中央對齊模式時,使用當前的向上/向下計數配置;這就意味著計數器向上還是向下計數取決于TIMx_CR1寄存器中DIR位的當前值。此外,軟件不能同時修改DIR和CMS位。

● 不推薦當運行在中央對齊模式時改寫計數器,因為這會產生不可預知的結果。特別地:

 ─ 如果寫入計數器的值大于自動重加載的值(TIMx_CNT>TIMx_ARR),則方向不會被更新。


例如,如果計數器正在向上計數,它就會繼續向上計數。

 ─ 如果將0或者TIMx_ARR的值寫入計數器,方向被更新,但不產生更新事件UEV。

● 使用中央對齊模式最保險的方法,就是在啟動計數器之前產生一個軟件更新(設置

TIMx_EGR 位中的UG位),不要在計數進行過程中修改計數器的值。


通過庫函數來配置該功能的步驟

注:本次學習的使用TIM3的向上計數模式(TIM3_CH2 通道將重映射到 PB5 上)產生PWM。


1. 開啟TIM3時鐘以及復用功能時鐘,配置PB5為復用輸出。


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //使能定時器3時鐘

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //復用時鐘使能

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB時鐘

  

  GPIO_InitTypeDef GPIO_ITDef_PB5;

  GPIO_ITDef_PB5.GPIO_Pin = GPIO_Pin_5;

  GPIO_ITDef_PB5.GPIO_Mode = GPIO_Mode_AF_PP;//復用推挽輸出

  GPIO_ITDef_PB5.GPIO_Speed = GPIO_Speed_2MHz;

  GPIO_Init(GPIOB,&GPIO_ITDef_PB5);


2. 設置TIM3_CH2重映射到 PB5上。


默認條件下,TIM3_REMAP[1:0]為 00,是沒有重映射的,所以 TIM3_CH1~TIM3_CH4 分別是接在 PA6、PA7、PB0 和 PB1 上的,而我們想讓 TIM3_CH2 映射到 PB5 上,則需要設置TIM3_REMAP[1:0]=10,即部分重映射,這里需要注意,此時 TIM3_CH1 也被映射到 PB4 上了。


GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //重映射 TIM3_CH2->PB5


3. 初始化TIM3, 設置TIM3的ARR和PSC 。

注:向上計數模式


  TIM_TBIStruct_TIM3.TIM_Period = 100; //設置自動重裝載值 ARR

  TIM_TBIStruct_TIM3.TIM_Prescaler = 7199; //設置預分頻值 PSC

  TIM_TBIStruct_TIM3.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim

  TIM_TBIStruct_TIM3.TIM_ClockDivision = TIM_CounterMode_Up; //TIM 向上計數模式  

  TIM_TimeBaseInit(TIM3,&TIM_TBIStruct_TIM3);


4. 設置TIM3_CH2的PWM 模式 使能TIM3的CH2輸出。

注:在固件庫"stm32f10x.h"和"stm32f10x.c"里能查到。


  void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

//主要還是TIM_OCInitTypeDef結構體的定義內容。

typedef struct

{

  uint16_t TIM_OCMode;//選擇定時器模式。

  /*

  TIM_OCMode_Timing  TIM 輸出比較時間模式

 TIM_OCMode_Active   TIM 輸出比較主動模式

 TIM_OCMode_Inactive TIM 輸出比較非主動模式

 TIM_OCMode_Toggle   TIM 輸出比較觸發模式

 TIM_OCMode_PWM1     TIM 脈沖寬度調制模式 1

 TIM_OCMode_PWM2     TIM 脈沖寬度調制模式 2

  */      

  uint16_t TIM_OutputState; //設置比較輸出使能

  uint16_t TIM_OutputNState; //指定TIM的互補輸出比較狀態。 

  //設置了待裝入捕獲比較寄存器的脈沖值。它的取值必須在 0x0000 和 0xFFFF 之間。

  uint16_t TIM_Pulse; 

  uint16_t TIM_OCPolarity;//輸出極性

  /*

  TIM_OCPolarity_High TIM 輸出比較極性高

  TIM_OCPolarity_Low TIM 輸出比較極性低

  */

  uint16_t TIM_OCNPolarity;//指定互補的輸出極性。  

  uint16_t TIM_OCIdleState; //指定空閑狀態下的TIM輸出比較引腳狀態。

  uint16_t TIM_OCNIdleState; //指定空閑狀態下的TIM輸出比較引腳狀態。

} TIM_OCInitTypeDef;


 //初始化 TIM3 Channel2 PWM 模式

  TIM_OCInitTypeDef TIM_OCITDef_TIM3; 

  TIM_OCITDef_TIM3.TIM_OCMode = TIM_OCMode_PWM2; //選擇 PWM 模式 2

  TIM_OCITDef_TIM3.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能

  TIM_OCITDef_TIM3.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性高  

  TIM_OC2Init(TIM3, &TIM_OCITDef_TIM3); //初始化外設 TIM3 OC2


注:TIM_OutputNState、TIM_OCNPolarity、TIM_OCIdleState 和 TIM_OCNIdleState 是高級定時器 TIM1 和 TIM8 才用到的


5. 使能TIM3。


TIM_Cmd(TIM3, ENABLE); //使能 TIM3


6. 修改TIM3_CCR2來控制占空比。

注:修改Compare2便可以修改占空比。


void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);


完整程序

#include "stm32f10x.h"  

/*

   TIM3輸出比較模式

   LED  PB5

   KEY0   

*/

u16 data = 0;//0-1000

u8 temp = 2;//1-250 2-500 3-1000

u8 dir = 1;

void delay_ms(u16 time)

{    

   u16 i = 0;  

   while(time--)

   {

      i = 12000;  

      while(i--);    

   }

}


void LED_Init_PE5(void)

{

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  

  GPIO_InitTypeDef GPIO_ITDef_PE5;

  GPIO_ITDef_PE5.GPIO_Pin = GPIO_Pin_5;

  GPIO_ITDef_PE5.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出

  GPIO_ITDef_PE5.GPIO_Speed = GPIO_Speed_2MHz;

  GPIO_Init(GPIOE,&GPIO_ITDef_PE5);

  GPIO_SetBits(GPIOE,GPIO_Pin_5);//1

}

void KEY0_Init_PE4(void)

{

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);

  GPIO_InitTypeDef GPIO_ITDef_PE4;

  GPIO_ITDef_PE4.GPIO_Pin = GPIO_Pin_4;

  GPIO_ITDef_PE4.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入

  GPIO_Init(GPIOE,&GPIO_ITDef_PE4); 

  

  //外部中斷

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

  

  EXTI_InitTypeDef EXTI_ITDef_PE4;

  EXTI_ITDef_PE4.EXTI_Line = EXTI_Line4;

  EXTI_ITDef_PE4.EXTI_Mode =  EXTI_Mode_Interrupt;//為中斷請求

  EXTI_ITDef_PE4.EXTI_Trigger = EXTI_Trigger_Falling;//輸入線路下升沿中斷

  EXTI_ITDef_PE4.EXTI_LineCmd = ENABLE;  

  EXTI_Init(&EXTI_ITDef_PE4);

  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置 NVIC 中斷分組 2:2 位搶占優先級,2 位響應優先級

  

  NVIC_InitTypeDef NVIC_ITDef;

  

  NVIC_ITDef.NVIC_IRQChannel = EXTI4_IRQn; //使能按鍵外部中斷通道

  NVIC_ITDef.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級 2,

  NVIC_ITDef.NVIC_IRQChannelSubPriority = 0x02; //子優先級 2

  NVIC_ITDef.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道

  

  NVIC_Init(&NVIC_ITDef);

   

}

void TIM3_Init(void)

{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //復用時鐘使能

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 

  

  GPIO_InitTypeDef GPIO_ITDef_PB5;

  GPIO_ITDef_PB5.GPIO_Pin = GPIO_Pin_5;

  GPIO_ITDef_PB5.GPIO_Mode = GPIO_Mode_AF_PP;//復用推挽輸出

  GPIO_ITDef_PB5.GPIO_Speed = GPIO_Speed_2MHz;

  GPIO_Init(GPIOB,&GPIO_ITDef_PB5);


  TIM_DeInit(TIM3);//復位TIM3(可要可不要)

  

  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //重映射 TIM3_CH2->PB5

 

  TIM_TimeBaseInitTypeDef TIM_TBIStruct_TIM3;

  

  TIM_TBIStruct_TIM3.TIM_Period = 100; //設置自動重裝載值

  TIM_TBIStruct_TIM3.TIM_Prescaler = 7199; //設置預分頻值

  TIM_TBIStruct_TIM3.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim

  TIM_TBIStruct_TIM3.TIM_ClockDivision = TIM_CounterMode_Up; //TIM 向上計數模式  

  TIM_TimeBaseInit(TIM3,&TIM_TBIStruct_TIM3);

  

  //初始化 TIM3 Channel2 PWM 模式

  TIM_OCInitTypeDef TIM_OCITDef_TIM3;  

  TIM_OCITDef_TIM3.TIM_OCMode = TIM_OCMode_PWM2; //選擇 PWM 模式 2

  TIM_OCITDef_TIM3.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能

  TIM_OCITDef_TIM3.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性高  

  TIM_OC2Init(TIM3, &TIM_OCITDef_TIM3); //初始化外設 TIM3 OC2

  

  TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能預裝載寄存器

  

  TIM_Cmd(TIM3,ENABLE); //使能 TIM3

}


int main(void)

{

  LED_Init_PE5();

  KEY0_Init_PE4();

  TIM3_Init();

  while(1)

  {

   

    //按鍵處理(通過按鍵改變占空比)

    switch(temp)

    {

      case 0:data=0;break;

      case 1:data=3;break;

      case 2:data=5;break;

      case 3:data=10;break;

      case 4:data=50;break;

      case 5:data=90;break;

      case 6:data=100;break;

    }

/*    data從0-200-0 來修改占空比

     delay_ms(10);

     if(dir)data++;

       else data--;

     if(data>200)dir=0;

     if(data==0)dir=1;

*/

     TIM_SetCompare2(TIM3,data);

  }

     

}

//按鍵中斷處理函數,按鍵每按一下,PE5的狀態翻轉一次(LED亮滅翻轉)

void EXTI4_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//判斷某個線上的中斷是否發生

   {

     delay_ms(10);     //按鍵延時消斗

     if(!(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)))//再次判斷是否按鍵按下

     {    

       temp++;//按下一次,temp+1,

       if(temp>6)temp=0;//這里可以根據實際需求修改

       

       if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5))//是滅的

       {

         GPIO_ResetBits(GPIOE,GPIO_Pin_5); //BRR  0 亮

       }else 

       {

         GPIO_SetBits(GPIOE,GPIO_Pin_5);  //BSRR  1  滅

       }          

     }   

    EXTI_ClearITPendingBit(EXTI_Line4); 

[1] [2]
關鍵字:STM32  固件庫  TM3  PWM  LED亮度 引用地址:STM32基于固件庫學習筆記(9)TM3產生PWM調LED亮度

上一篇:STM32學習筆記(一)GPIO
下一篇:STM32基于固件庫學習筆記(12)LCD5110顯示

推薦閱讀

近日,俄羅斯彼爾姆國立研究大學物理系大四學生維克多·扎科派洛建立了一個能預測2018年世界杯冠軍的神經網絡。神經網絡綜合各項參數進行分析計算后得出結論稱,世界杯前三名將是德國隊、巴西隊和阿根廷隊。當AI擁有人類的“數字化人格”之時,對用戶數據的“智能挖掘”很容易游走在“合規”但“有違公平”的邊緣。
主要思路:文件從main.c文件到main()函數開始:主要重點是,開啟中斷:USB_Interrupts_Config();STM32不像C51單片機那樣可以用過interrupt關鍵字來定義中斷響應函數,STM32的中斷響應函數接口存在中斷向量表中。其格式如下:在文件hw_config.c里:/* Enable the USB interrupt */NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_I...
6月11日消息,微博大V@手機晶片達人爆料:今年10月份華為會如期發布5nm工藝麒麟處理器的Mate 40系列手機,并將在第四季供貨約8百萬臺Mate 40手機。 此前有外媒爆料稱華為下一代旗艦芯片命名為麒麟1000(一說麒麟1020),并將采用臺積電5nm工藝打造。 據悉,麒麟1000開發代號為...
距離雷老板信誓旦旦地發布他「賭上全部榮譽,人生的最后一次創業」已經過去兩個多月了。 跟行業里的朋友們聊起小米造車這事,有個共同的觀點總會被提到。我覺得有點兒意思,于是進行了一番思考和分析,這也是今天這篇文章成文的原因。 我們認為, 小米造車的眾多優勢中, 最有可能大放異彩的必定是智能座艙。 那么,小米汽車的智能座艙究竟會有什么不同?...

史海拾趣

問答坊 | AI 解惑

渣打銀行個人無抵押無擔保貸款

渣打銀行個人無抵押無擔保貸款 貸款額度:8000--20萬 貸款期限:6個月-- 4年 貸款要求: 1、22-60周歲 2、在上海工作,現單位工作3個月以上. 3、稅前月薪收入3000以上(銀行代發工資). 所需資料: 1. 身份證 2. 收入證明: 銀行工資流水單和 ...…

查看全部問答∨

變頻器停車咋整?

對于55KW及以上的風機,無制動電阻的情況下,變頻器的停車方式,有何不同,自由停車與正常停車,均可以正常運行嗎,自由停車是否對變頻器本身有損壞?…

查看全部問答∨

請教大家,如何在IAR下用JLINK調試STM32。

開發環境:IAR4.42+JLINK V6(全功能)+EK-STM32F。請問:1.在JLINK調試方式下、在JTAG接口下,在FLASH中可以設置幾個斷點?2.在JLINK調試方式下、在SWD接口下,在FLASH中可以設置幾個斷點?3.能用RDI方式調試STM32嗎?如果能,請問可以 ...…

查看全部問答∨

【MSP430共享】氣壓與心電相關數據采集系統的設計

設計了一種氣壓與心電同步數據采集系統. 利用該系統對氣壓和心電信號進行長時間同步采集, 揭示了氣壓變化與心電信粵之間的對應關系. 為滿足系統低功耗的需要, 通過對MS P 4 3 0 F 1 4 9 以及外圍電路的分析, 分別給出軟硬件解決方法; 另一方 ...…

查看全部問答∨

基于FPGA技術的RFID系統的解碼模塊設計

 RFID技術(radiofrequencyidentification)是一種非接觸式智能識別技術,它通過射頻信號自動識別目標對象并獲得相關信息。整個識別過程無需人工介入,可同時識別多個對象并可以識別高速運動的物體,操作簡單,廣泛應用在車輛自動識別系統、物流管理 ...…

查看全部問答∨

無刷電機入門者的福音--STM8S 無刷電機控制器 DEMO 開源(轉)

硬件是 一個PCB 是功率板,可以用來做 hall 和SENSORLESS的,sensorLESS 工作在比較器模式下。當然也可以做HALL 模式下的FOC算法。 MCU板就是一個最小系統板。兩個模擬電位計,兩個直撥開關。還有一個電源開關。 圖片是一個做的風扇,實際測量20W ...…

查看全部問答∨

【跟TI學電源】系列-----TI標準模擬線性器件指南

     德州儀器 (TI) 推出的電源管理產品持續不斷地提供面向便攜式及交流電源供電型設計的優化電源解決方案。傳統應用包括用于計算、電信和網絡系統、數字電視、機頂盒、視頻監控系統及消費電子產品(例如:智能手機、平板電腦 ...…

查看全部問答∨

SCI 怎么接收數據。。。急!!!!!!

各位大神,我是新手,請教SCI 怎么接收數據?用串口調試助手發個數,板子怎么接收,有接收子程序嗎?…

查看全部問答∨

幫看看我這個老式機械電度表

這個哪邊是進哪邊是出呀?火線零線怎么區分的呀 這個電度表最小電流大概多少就不轉沒反應了? 這個電表3(6)A是什么意思?到底是3還是6?本來我想著串在我家里總開關上看看小區的計費和這個有沒有誤差,看來是不是功率太小?廚房有微波爐電 ...…

查看全部問答∨

2812運行異常help

2812在調試過程中 發現,隨著代碼的增加 燒寫進入FLASH出現上電不允運行的現像。一旦退回到上一個版本的代碼 運行即恢復正常。現在可以肯定硬件沒有問題。經過反復的試驗,發現在工程中的一個C文件里增加定義了一個全局變量后燒寫進Flash就出現復位 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 肥西县| 泰和县| 华蓥市| 旌德县| 陇西县| 岑溪市| 屏南县| 那曲县| 称多县| 读书| 伊春市| 灌云县| 永定县| 星子县| 潜山县| 德清县| 伊春市| 广河县| 蒲城县| 涪陵区| 潜江市| 天门市| 石楼县| 江华| 民勤县| 加查县| 嘉鱼县| 邳州市| 和平区| 德钦县| 安陆市| 四平市| 聂荣县| 柘城县| 建湖县| 庆阳市| 巢湖市| 德清县| 石景山区| 开江县| 饶河县|