stm32單片機中使用GPIO口模擬PWM輸出解析

2020-11-26 電子發燒友

  STM32系列基於專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核(ST『s product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform)[1] 。按內核架構分為不同產品:

  其中STM32F系列有:STM32F103「增強型」系列STM32F101「基本型」系列STM32F105、STM32F107「互聯型」系列

  增強型系列時鐘頻率達到72MHz,是同類產品中性能最高的產品;基本型時鐘頻率為36MHz,以16位產品的價格得到比16位產品大幅提升的性能,是32位產品用戶的最佳選擇。兩個系列都內置32K到128K的快閃記憶體,不同的是SRAM的最大容量和外設接口的組合。時鐘頻率72MHz時,從快閃記憶體執行代碼,STM32功耗36mA,相當於0.5mA/MHz。

  gpio

  General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業標準I2C、SMBus或SPI接口簡化了I/O口的擴展。當微控制器或晶片組沒有足夠的I/O埠,或當系統需要採用遠端串行通信或控制時,GPIO產品能夠提供額外的控制和監視功能。

  分類:硬體/嵌入開發驅動開發/核心開發

  每個GPIO埠可通過軟體分別配置成輸入或輸出。Maxim的GPIO產品線包括8埠至28埠的GPIO,提供推挽式輸出或漏極開路輸出。提供微型3mm x 3mm QFN封裝。

  PWM

  PWM控制技術以其控制簡單,靈活和動態響應好的優點而成為電力電子技術最廣泛應用的控制方式,也是人們研究的熱點。由於當今科學技術的發展已經沒有了學科之間的界限,結合現代控制理論思想或實現無諧振波開關技術將會成為PWM控制技術發展的主要方向之一。其根據相應載荷的變化來調製電晶體基極或MOS管柵極的偏置,來實現電晶體或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數位訊號對模擬電路進行控制的一種非常有效的技術。

  

  stm32單片機中使用GPIO口模擬PWM輸出解析

  使用了STM32F10364引腳的MCU,在硬體設計中,因為外設較多,導致每個通用定時器至少有兩個PWM輸出引腳被佔用,現在要控制RGB燈,只能用一個普通IO引腳模擬PWM輸出。

  相關的硬體電路設置如下:

  GPIOA1------------------------------RGBBLUE燈

  GPIOB1------------------------------RGBGREEN燈

  GPIOD2------------------------------RGBRED燈

  RGB燈採用了共陽極電路,所以在PWM的輸出急性設置時,將極性設置為高電平,定時器的初始化如下圖所示:

  void initLedTimer( void ){

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_OCInitTypeDef TIM_OCInitStructure;

  TIM_DeInit( TIM2 );

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure );

  TIM_TimeBaseStructure.TIM_Period =TIMER_PERIOD;

  TIM_TimeBaseStructure.TIM_Prescaler =TIMER_PRESCALER;

  TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1; // 不分頻

  TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  TIM_OCStructInit(&TIM_OCInitStructure );

  TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2;

  TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Disable;

  TIM_OCInitStructure.TIM_Pulse =DEFAULT_DUTY_CYCLE;

  TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;

  //

  TIM_OC1Init(TIM2,&TIM_OCInitStructure);

  //

  TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);

  //

  TIM_OC2Init(TIM2,&TIM_OCInitStructure);

  //

  TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);

  //

  TIM_OC3Init(TIM3,&TIM_OCInitStructure);

  //

  TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

  //

  TIM_OC4Init(TIM3,&TIM_OCInitStructure);

  //

  TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

  //

  TIM_OCStructInit(&TIM_OCInitStructure );

  TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Timing;

  TIM_OCInitStructure.TIM_Pulse =DEFAULT_DUTY_CYCLE;

  //

  TIM_OC2Init(TIM3,&TIM_OCInitStructure);

  //

  TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

  // ARR重裝載使能

  TIM_ARRPreloadConfig(TIM2,ENABLE);

  TIM_ARRPreloadConfig(TIM3,ENABLE);

  //

  TIM_ClearITPendingBit( TIM2,TIM_IT_Update );

  TIM_ClearITPendingBit( TIM3,TIM_IT_Update | TIM_IT_CC2 );

  //定時器2和3中斷使能

  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

  TIM_ITConfig(TIM3,TIM_IT_Update |TIM_IT_CC2, ENABLE);

  }

  輸出極性為高電平的意思就是說,假如說佔空比為20%,那麼他表示,低電平佔整個周期20%的時間,反之如果設置極性為低電平,那麼表示高電平佔用整個周期的20%。

  如何用GPIOD2模擬PWM波形呢? 關鍵的地方就是同時必須使用定時器中斷

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • STM32學習筆記——使用函數庫編程控制GPIO口輸出
    看了網上許多人的代碼以及各類開發板所帶的例程,大多數使用的都是官方發布的函數庫來編程,通過查詢後發現,使用函數庫來編程可以簡化開發過程,並不需要追溯到各個寄存器,通過查看庫手冊,新手也可以快速應用STM32,因此
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   3. avr的I/O腳類似pic,它也有用來控制輸入或輸出的方向寄存器,在輸出狀態下,高電平輸出的電流在10mA左右,低電平吸入電流20mA。這點雖不如pic,但比51系列還是要優秀。   AVR單片機優點:   AVR單片機是Atmel公司推出的較為新穎的單片機,其顯著的特點為高性能、高速度、低功耗。
  • STM32單片機GPIO寄存器
    ,這四位中的高兩位(CNF0,CNF1)設置GPIO的輸入輸出模式,低兩位(MODE0,MODE1)是設置GPIO的輸出頻率,具體可以參考STM32參考手冊。GPIOA->CRH&=0XFFFFFFF0; //清掉PA8原來的設置,同時屏蔽其它埠,不影響其它埠的設置GPIOA->CRH|=0X00000003;//PA8 推輓輸出十六進位中的3 換成二進位 00 11 前兩位00表示推輓輸出,11代表輸出頻率50Mhz,若CRH|=0x4,表示模擬輸入模式
  • 使用國產單片機是什麼體驗?(文末申請開發板測評)
    伴隨著濃濃的中國芯熱情下,國產晶片越來越好了,國產單片機也逐漸成為工程師的優選。 那麼用國產單片機開發究竟是怎樣的體驗? 1、利用東軟載波開發板進行ADC及PWM調光測試 ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。 ESF0654 PDS開發板ADC接在PB0接口,PB0為ADC0的14通道。
  • STM32F4輸出PWM波形的配置總結
    單片機輸出pwm的原理涉及模塊:GPIO、TIM1主要寄存器:TIMx_CCR、TIMx_ARR、TIMx_CNT原理圖通用定時器可以利用GPIO引腳進行脈衝輸出,在配置為比較輸出、PWM輸出功能時,捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡稱為比較寄存器。
  • STM32的GPIO口的輸出:開漏輸出和推輓輸出
    很多晶片的供電電壓不一樣,有3.3v和5.0v,需要把幾種IC的不同口連接在一起,是不是直接連接就可以了?所謂開漏電路概念中提到的「漏」就是指MOSFET的漏極。同理,開集電路中的「集」就是指三極體的集電極。開漏電路就是指以MOSFET的漏極為輸出的電路。一般的用法是會在漏極外部的電路添加上拉電阻。完整的開漏電路應該由開漏器件和開漏上拉電阻組成。  組成開漏形式的電路有以下幾個特點:  1. 利用 外部電路的驅動能力,減少IC內部的驅動。
  • GPIO相關寄存器配置詳解
    也就是10個寄存器,一共可以控制一組GPIO的16個IO口。最多7組IO,也就是70個寄存器。(一)每一個IO引腳都可以使用軟體配置為以下幾種模式:   1. 浮空輸入  2. ,並在總線上使能對應的GPIO口(AFIO口,需要的話)時鐘後:根據需求配置相應GPIO埠為對應的輸入/輸出模式,按需求更改/讀取埠的數據;埠功能重映射;若用外部中斷,則將中斷線與對應引腳連結起來。
  • STM32的IO口輸入輸出模式的理解
    五、復用開漏輸出、復用推輓輸出:可以理解為GP被用作第二功能時的配置情況(即並非作為通用IO口使用)六、總結在中選用IO模式1、浮空輸入GPIO_IN_FLOATING ——浮空輸入,可以做KEY識別,RX12、帶上拉輸入GPIO_IPU——IO內部上拉電阻輸入3、帶下拉輸入GPIO_IPD—— IO內部下拉電阻輸入
  • stc單片機IO口輸入輸出方式
    IO口的四種使用方法從I/O口的特性上看,標準51的P0口在作為I/O口使用時,是開漏結構,在實際應用中通常要添加上拉電阻;P1、P2、P3都是準雙向I/O,內部有上拉電阻,既可作為輸入又可以作為輸出。
  • PWM原理
    導讀:學過單片機的同學,對PWM應該不陌生,一般學習單片機的第二個例程就是用PWM技術調節佔空比來控制LED亮度。然而PWM控制技術在逆變電路中應用最廣,正是有賴於其在逆變電路中的應用,才確定了它在電力電子技術中的重要地位。因此本文主要介紹PWM原理,對電力電子感興趣的同學關注一下吧。。。
  • 單片機IO口科普:推輓輸出、開漏輸出詳解
    什麼是推輓輸出  推輓輸出既可以輸出低電平,也可以輸出高電平,可以直接驅動功耗不大的數字器件。  2. 推輓輸出電路的結構  推挽電路是由兩個三極體或MOSFET,以推挽方式存在於電路中,電路工作時,兩隻對稱的開關管每次只有一個導通,所以導通損耗小、效率高、既提高電路的負載能力,又提高開關速度。
  • 投幣器的輸出信號脈衝檢測
    (3) 投幣器幣道中是否有異物,有時候防止一些有粘性的物體阻塞在投幣器的錢道中。(4) 如果是比較式投幣器,則看一下樣幣是否夾好,是否正確。(5) 投幣器的電磁鐵開門條是否卡死而電磁鐵吸不動。(6) 投幣器的出幣口過幣是否通暢。
  • 單片機中PWM的工作原理解析
    PWM在單片機中的應用是非常廣泛的,它的基本原理很簡單,但往往應用於不同場合上意義也不完全一樣,這裡我先把基本概念和基本原理給大家介紹一下,後邊遇到用的時候起碼知道是個什麼東西。 PWM是Pulse Width Modulation的縮寫,它的中文名字是脈衝寬度調製,一種說法是它利用微處理器的數字輸出來對模擬電路進行控制的一種有效的技術,其實就是使用數位訊號達到一個模擬信號的效果。這是個什麼概念呢?我們一步步來介紹。
  • 用SST單片機的PCA功能產生PWM脈衝
    一、程序說明:SST單片機帶有5路PCA模塊,PCA功能比普通的單片機相比提供更強的計時性,同時更少CPU的幹預,用它可以減少軟體的開銷和改進精度。
  • 基於AVR單片機的LED照明燈控制系統設計
    當紅外接收器接收到紅外遙控信號時,通過外部中斷將AVR單片機從休眠模式中喚醒;AVR單片機開始解析紅外信號,如果與系統地址匹配,則將根據解析到的命令改變LED恆流源驅動的輸入,從而改變LED燈的狀態。ATmega8是Atmel公司在2002年推出的一款AVR單片機,採用小引腳封裝。ATmega8內部集成 8 KB的可編程F1ash、512位元組EEPROM和1KB內部SRAM;3個PWM通道,可實現任意小於16位、相位和頻率可調的PWM脈寬調製輸出;1 個可編程的串行USART接口,支持同步、異步以及多機通信自動地址識別;5種省電模式。
  • MIO與EMIO的關係解析 GPIO、MIO、EMIO的區別
    在外設I/O中,打開UART1,對應MIO48、49口,打不打開都無所謂,打開調試用。此時在MIO中已經看到UART1已經分配了管腳,然後在GPIO裡,打開MIO。=XST_SUCCESS)//初始化成功return XST_FAILURE; 然後就是定義gpio口的屬性,包括輸入輸出和埠使能: XGpioPs_SetDirectionPin(&xgpio, LED1, 1);//outputXGpioPs_SetDirectionPin(&xgpio, LED2, 1);// XGpioPs_SetOutputEnablePin
  • 用ULN2003驅動24BYJ48步進電機時,怎麼接stm32單片機比較好?
    stm32單片機是一種高性能、低成本、低功耗的單片機,可以說很多應用場合都會用到,特別是對於大型系統,像電源、充電樁、交互機、電機驅動、PLC、逆變器、印表機、掃描儀、警報系統、視頻電話、 HVAC 等。那麼對於如何用STM32驅動步進電機呢?
  • STM32的IO口灌入電流和輸出驅動電流最大是多少?
    剛開始學習一款單片機的時候一般都是從操作IO口開始的,所以我也一樣,先是弄個流水燈。   剛開始我對STM32的認識不夠,以為是跟51單片機類似,可以直接操作埠,可是LED燈卻沒反應,於是乎,仔細查看資料發現,原來對於ARM,不管你要操作哪個IO口,都要先配置IO口。
  • PWM控制MOSFET搭建的H橋電路驅動直流電機仿真與單片機源碼
    PIC單片機 proteus H橋驅動直流電機PWM控制MOSFET搭建的H橋電路驅動直流電機運行仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速採取適當措施,避免給雙方造成不必要的經濟損失。
  • PWM調製中的死區問題
    (就是上、下半橋的元件都是關斷的)  死區時間控制在通常的低端單片機所配備的PWM中是沒有的。區時間是PWM輸出時,為了使H橋或半H橋的上下管不會因為開關速度問題發生同時導通而設置的一個保護時段,所以在這個時間,上下管都不會有輸出,當然會使波形輸出中斷,死區時間一般只佔百分之幾的周期。