tft每日頭條

 > 生活

 > stm32pwm呼吸燈原理

stm32pwm呼吸燈原理

生活 更新时间:2024-07-22 19:19:03

在之前的文章中,我們已經了解了使用 STM32 進行 ADC 轉換。現在,我們将了解STM32 中的 pwm(脈沖寬度調制)以及如何使用 PWM 技術控制 LED 的亮度或直流風扇的速度。

我們知道有兩種類型的電路信号:模拟和數字。模拟信号有3V、3.1V、2V...等電壓信号,而數字信号隻有1 和 0。

傳感器輸出的是模拟信号,這些模拟信号使用 ADC 轉換為數字信号,因為微控制器隻理解數字信号。處理完這些 ADC 值後,需要再次将輸出轉換為模拟形式以驅動模拟設備。為此,我們使用某些方法,如 PWM、數模 (DAC) 轉換器等。

什麼是 PWM(脈沖寬度調制)?(前面的文章也有相關介紹)

PWM可以讓數字值控制模拟設備,例如控制電機的速度,LED的亮度等。我們知道電機和LED工作在模拟信号上。但是PWM不提供純模拟輸出,PWM看起來像是由短脈沖産生的模拟信号。

PWM 的占空比

PWM 信号保持高電平(ON Time)的時間百分比稱為占空比。如果信号始終打開,則占空比為 100%,如果始終關閉,則占空比為 0%。

占空比 = ON Time /(ON Time OFF Time)

stm32pwm呼吸燈原理(STM32脈寬調制)1

STM32中的PWM

STM32F103C8 有 15 個 PWM 引腳和 10 個 ADC 引腳。它具有 16 位 PWM 分辨率(2^16)。

所以 65535 的值為100% 占空比,平均電壓=總電壓;

同樣,32767 的值為50% 占空比,平均電壓=50%總電壓;

13107 的值為20% 占空比,平均電壓=20%總電壓。

這裡我們使用電位器和 STM32 通過 PWM 技術來改變 LED 的亮度和直流風扇的速度。1602 LCD用于顯示 ADC 值 (0-4095) 和輸出的PWM 值 (0-65535) 。

直流風扇:這裡使用的直流風扇是PC 的 BLDC 風扇。它需要額外提供電源,所以我們使用 9V 直流電池。

ULN2003電機驅動IC:用于單向驅動電機。下面是ULN2003的圖片圖:

stm32pwm呼吸燈原理(STM32脈寬調制)2

引腳(IN1 到 IN7)是輸入引腳,(OUT 1 到 OUT 7)是相應的輸出引腳。COM 是負載的正極電壓。

電位器:使用兩個電位器,一個用于分壓器,用于模拟輸入到 ADC,另一個用于控制 LED 的亮度。

STM32的管腳細節

stm32pwm呼吸燈原理(STM32脈寬調制)3

我們可以看到 PWM 引腳以波浪線(~) 表示,有 15 個這樣的引腳;有 10 個 ADC 引腳用于模拟輸入,ADC 引腳以綠色标出。

電路圖和連接

stm32pwm呼吸燈原理(STM32脈寬調制)4

STM32 與各種組件的連接說明如下:

> STM32的模拟(ADC)輸入

靠近ST32開發闆的電位器的中心引腳連接到STM32 的ADC引腳(PA4),該電位器用來調節輸入ADC的電壓。

>STM32連接LED

STM32 PWM 輸出引腳(PA9)通過串聯電阻連接到 LED 的正極引腳,LED并聯一個電容。

>STM32 連接ULN2003 和 ULN2003連接風扇

STM32 PWM 輸出引腳(PA8)連接到 ULN2003 IC 的輸入引腳(IN1),ULN2003 的相應輸出引腳(OUT1)連接到 直流風扇的負極線。

直流風扇的正極引腳連接到 ULN2003 IC 的 COM 引腳,外部電池(9V DC)也連接到 ULN2003 IC 的相同 COM 引腳。ULN2003 的GND、 STM32的GND、電池負極連接到電路相同的 GND。

>STM32 連接LCD (1602)

stm32pwm呼吸燈原理(STM32脈寬調制)5

>整體電路

stm32pwm呼吸燈原理(STM32脈寬調制)6

編程STM32

#include <LiquidCrystal.h> // LCD庫 //聲明LCD連接到STM32的哪個引腳 const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化 LCD const int analoginput = PA4; //電位器輸入 const int led = PA9; // LED PWM輸出 const int fan = PA8; // 風扇 輸出 void setup() { lcd.begin(16,2); //16*2LCD lcd.clear(); //LCD清屏 lcd.setCursor(0,0); //将光标設置在第0行和第0列 lcd.print("Hello World"); lcd.setCursor(0,1); //設置光标在第二行第一列 lcd.print("PWM USING STM32"); //LCD顯示 PWM using STM32 delay(2000); // 延時2秒 lcd.clear(); // LCD清屏 pinMode(analoginput, INPUT); // 設置為模拟輸入 pinMode(led, PWM); // 設置為PWM輸出 控制led pinMode(fan, PWM); // 設置為PWM輸出 控制風扇 } void loop() { int valueadc = analogRead(analoginput); //從引腳 PA4 讀取 ADC 值 (電位 器值) int result = map(valueadc, 0, 4095, 0, 65535); //把valueadc 從0-4095映射轉為0-65535映射并存儲到result中 pwmWrite(led, result); //以PWM波控制LED pwmWrite(fan, result); lcd.setCursor(0,0); //設置光标位置 lcd.print("ADC value= "); // LCD 顯示ADC value= lcd.print(valueadc); //顯示電位器ADC值 lcd.setCursor(0,1); //設置光标位置 lcd.print("Output = "); //LCD 顯示Output = lcd.print(result); //顯示電位器映射0-65535的值 }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved