在本教程中,我們將了解STM32中的PWM(脈寬調(diào)制),以及如何使用PWM技術(shù)控制LED的亮度或直流風(fēng)扇的速度。
我們知道有兩種類型的信號:模擬和數(shù)字。模擬信號具有(3V,1V...等)和數(shù)字信號有(1'和0)。傳感器輸出為模擬信號,這些模擬信號使用ADC轉(zhuǎn)換為數(shù)字信號,因?yàn)?a target="_blank">微控制器只能理解數(shù)字信號。處理完這些ADC值后,需要再次將輸出轉(zhuǎn)換為模擬形式以驅(qū)動(dòng)模擬器件。為此,我們使用某些方法,例如PWM,數(shù)模(DAC)轉(zhuǎn)換器等。
什么是PWM(帶調(diào)制的脈沖)?
PWM是一種使用數(shù)字值控制模擬設(shè)備的方法,例如控制電機(jī)的速度,LED的亮度等。我們知道電機(jī)和LED在模擬信號上工作。但是PWM不提供純模擬輸出,PWM看起來像由短脈沖產(chǎn)生的模擬信號,而短脈沖是由占空比提供的。
PWM 的占空比
PWM信號保持高電平(導(dǎo)通時(shí)間)的時(shí)間百分比稱為占空比。如果信號始終為ON,則處于100%占空比,如果始終關(guān)閉,則為0%占空比。
Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)
采用STM32封裝的PWM
STM32F103C8具有15個(gè)PWM引腳和10個(gè)ADC引腳。有 7 個(gè)定時(shí)器,每個(gè) PWM 輸出由連接到 4 個(gè)定時(shí)器的通道提供。它具有 16 位 PWM 分辨率 (216),即計(jì)數(shù)器和變量可以大到 65535。在 72MHz 時(shí)鐘速率下,PWM 輸出的最大周期約為 1 毫秒。
因此,值 65535 給出了 LED 的全亮度和直流風(fēng)扇的全速(100% 占空比)
同樣,32767 的值給出了 LED 的一半亮度和直流風(fēng)扇的一半速度(50% 占空比)
值 13107 給出 (20%) 亮度和 (20%) 速度(20% 占空比)
在本教程中,我們使用電位計(jì)和STM32通過PWM技術(shù)改變LED的亮度和直流風(fēng)扇的速度。16x2 LCD用于顯示ADC值(0-4095)和輸出的修改變量(PWM值)(0-65535)。
以下是其他微控制器的幾個(gè)PWM示例:
基于 Arduino 的 LED 調(diào)光器,使用 PWM
使用 MSP430G2 的脈寬調(diào)制 (PWM)
在此處查看所有與PWM相關(guān)的項(xiàng)目。
所需組件
STM32F103C8
直流風(fēng)扇
ULN2003 電機(jī)驅(qū)動(dòng)器 IC
指示燈(紅色)
液晶顯示器 (16x2)
電位計(jì)
面包板
電池 9V
跳線
直流風(fēng)扇:這里使用的直流風(fēng)扇是來自舊PC的BLDC風(fēng)扇。它需要外部電源,因此我們使用 9V 直流電池。
ULN2003 電機(jī)驅(qū)動(dòng)器 IC:它用于在一個(gè)方向上驅(qū)動(dòng)電機(jī),因?yàn)殡姍C(jī)是單向的,風(fēng)扇也需要外部電源。在此處了解有關(guān)基于 ULN2003 的電機(jī)驅(qū)動(dòng)器電路的更多信息。以下是ULN2003的圖片圖:
引腳(IN1 到 IN7)是輸入引腳,(OUT 1 到 OUT 7)是相應(yīng)的輸出引腳。COM 被賦予輸出設(shè)備所需的正源電壓。
發(fā)光二極管:使用紅色 LED 發(fā)出紅光。可以使用任何顏色。
電位器:使用兩個(gè)電位器,一個(gè)用于ADC模擬輸入的分壓器,另一個(gè)用于控制LED的亮度。
STM32的引腳詳細(xì)信息
正如我們所看到的,PWM引腳以波形格式(~)表示,有15個(gè)這樣的引腳,ADC引腳以綠色表示,10個(gè)ADC引腳用于模擬輸入。
電路圖和連接
STM32與各種組件的連接說明如下:
STM32,帶模擬輸入(ADC)
電路左側(cè)的電位計(jì)用作穩(wěn)壓器,用于調(diào)節(jié)來自3.3V引腳的電壓。電位計(jì)的輸出,即電位計(jì)的中心引腳連接到STM32的ADC引腳(PA4)。
STM32 帶指示燈
STM32 PWM輸出引腳(PA9)通過串聯(lián)電阻和電容連接到LED的正極引腳。
串聯(lián)電阻和并聯(lián)電容器與 LED 連接,以從 PWM 輸出產(chǎn)生正確的模擬波,因?yàn)槟M輸出與直接從 PWM 引腳生成時(shí)不是純凈的。
STM32 帶 ULN2003 和 ULN2003 帶風(fēng)扇
STM32 PWM輸出引腳(PA8)連接到ULN2003 IC的輸入引腳(IN1),ULN2003的相應(yīng)輸出引腳(OUT1)連接到直流風(fēng)扇的負(fù)極線。
直流風(fēng)扇的正極引腳連接到 ULN2003 IC 的 COM 引腳,外部電池 (9V DC) 也連接到 ULN2003 IC 的同一 COM 引腳。ULN2003的接地引腳連接到STM32的接地引腳,電池負(fù)極連接到同一接地引腳。
STM32 帶液晶顯示器 (16x2)
液晶屏引腳編號 | 液晶屏引腳名稱 | STM32 引腳名稱 |
1 | 地面(錠) | 地面 (G) |
2 | 可變資本公司 | 5V |
3 | 維伊 | 電位計(jì)中心的引腳 |
4 | 寄存器選擇 (RS) | PB11 |
5 | 讀/寫 (RW) | 地面 (G) |
6 | 啟用 (英文) | PB10 |
7 | 數(shù)據(jù)位 0 (DB0) | 無連接(常閉) |
8 | 數(shù)據(jù)位 1 (DB1) | 無連接(常閉) |
9 | 數(shù)據(jù)位 2 (DB2) | 無連接(常閉) |
10 | 數(shù)據(jù)位 3 (DB3) | 無連接(常閉) |
11 | 數(shù)據(jù)位 4 (DB4) | PB0 |
12 | 數(shù)據(jù)位 5 (DB5) | PB1 |
13 | 數(shù)據(jù)位 6 (DB6) | 電腦13 |
14 | 數(shù)據(jù)位 7 (DB7) | 電腦14 |
15 | 正極指示燈 | 5V |
16 | 負(fù)極指示燈 | 地面 (G) |
右側(cè)的電位計(jì)用于控制LCD顯示屏的對比度。上表顯示了LCD和STM32之間的連接。
在此編碼中,我們將從連接到左電位計(jì)中心引腳的ADC引腳(PA4)獲取輸入模擬值,然后將模擬值(0-3.3V)轉(zhuǎn)換為數(shù)字或整數(shù)格式(0-4095)。該數(shù)字值進(jìn)一步作為PWM輸出提供,以控制LED亮度和直流風(fēng)扇的速度。16x2 LCD用于顯示ADC和映射值(PWM輸出值)。
首先,我們需要包含LCD頭文件,聲明LCD引腳并使用以下代碼初始化它們。
#include // include the LCD library
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
接下來使用STM32的引腳聲明和定義引腳名稱
const int analoginput = PA4; // Input from potentiometer
const int led = PA9; // LED output
const int fan = PA8; // fan output
現(xiàn)在在setup()中,我們需要顯示一些消息并在幾秒鐘后清除它們,并指定輸入引腳和PWM輸出引腳
lcd.begin(16,2); //Getting LCD ready
lcd.clear(); //Clears LCD
lcd.setCursor(0,0); //Sets cursor at row0 and column0
lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest
lcd.setCursor(0,1); //Sets Cursor at column0 and row1
lcd.print("PWM USING STM32"); //Displays PWM using STM32
delay(2000); // Delay Time
lcd.clear(); // Clears LCD
pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT
pinMode(led, PWM); // set pin mode led as PWM output
pinMode(fan, PWM); // set pin mode fan as PWM output
模擬輸入引腳(PA4)通過引腳模式(模擬輸入,輸入)設(shè)置為輸入,LED引腳設(shè)置為PWM輸出由引腳模式(led,PWM),風(fēng)扇引腳設(shè)置為PWM輸出由引腳模式(風(fēng)扇,PWM)設(shè)置。此處,PWM 輸出引腳連接到 LED (PA9) 和風(fēng)扇 (PA8)。
接下來在void loop()函數(shù)中,我們從ADC引腳(PA4)讀取模擬信號并將其存儲在一個(gè)整數(shù)變量中,該整數(shù)變量使用以下代碼將模擬電壓轉(zhuǎn)換為數(shù)字整數(shù)值(0-4095) int valueadc = analogRead(analoginput);
這里需要注意的重要一點(diǎn)是PWM引腳,即STM32的通道具有16位分辨率(0-65535),因此我們需要使用如下所示的映射功能將其與模擬值進(jìn)行映射
int result = map(valueadc, 0, 4095, 0, 65535).
如果不使用映射,我們將無法通過改變電位計(jì)來獲得風(fēng)扇的全速或LED的全亮度。
然后,我們使用pwmWrite(led,結(jié)果)將PWM輸出寫入LED,并使用pwmWrite(風(fēng)扇,結(jié)果)函數(shù)將PWM輸出寫入風(fēng)扇。
最后,我們使用以下命令在LCD顯示屏上顯示模擬輸入值(ADC值)和輸出值(PWM值)
lcd.setCursor(0,0); //Sets cursor at row0 and column0
lcd.print("ADC value= "); // prints the words “”
lcd.print(valueadc); //displays valueadc
lcd.setCursor(0,1); //Sets Cursor at column0 and row1
lcd.print("Output = "); //prints the words in ""
lcd.print(result); //displays value result
#include
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD
const int analoginput = PA4; // Input from potentiometer
const int led = PA9; // LED output
const int fan = PA8; // fan output
void setup()
{
lcd.begin(16,2); //Getting LCD ready
lcd.clear(); //Clears LCD
lcd.setCursor(0,0); //Sets cursor at row0 and column0
lcd.print("CIRCUIT DIGEST"); //Displays Circuit Digest
lcd.setCursor(0,1); //Sets Cursor at column0 and row1
lcd.print("PWM USING STM32"); //Displays PWM using STM32
delay(2000); // Delay yime
lcd.clear(); // Clears LCD
pinMode(analoginput, INPUT); // set pin mode analoginput as INPUT
pinMode(led, PWM); // set pin mode led as PWM output
pinMode(fan, PWM); // set pin mode fan as PWM output
}
void loop()
{
int valueadc = analogRead(analoginput); //gets analog value from pot and store in variable,converts to digital
int result = map(valueadc, 0, 4095, 0, 65535); //maps the (0to4095 into 0to65535) and stores in result variable
pwmWrite(led, result); //puts resultin PWM form
pwmWrite(fan, result); //puts resultin PWM form
lcd.setCursor(0,0); //Sets cursor at row0 and column0
lcd.print("ADC value= "); // prints the words in ""
lcd.print(valueadc); //displays value
lcd.setCursor(0,1); //Sets Cursor at column0 and row1
lcd.print("Output = "); //prints the words in ""
lcd.print(result); //displays value result
}
-
PWM
+關(guān)注
關(guān)注
116文章
5409瀏覽量
218286 -
STM32
+關(guān)注
關(guān)注
2290文章
11018瀏覽量
362688 -
脈寬調(diào)制
+關(guān)注
關(guān)注
3文章
232瀏覽量
38783
發(fā)布評論請先 登錄
溫控直流風(fēng)扇電路圖分享

PWM是如何控制LED亮度的
典型的直流風(fēng)扇控制電路有哪幾種形式
DX9087 內(nèi)置霍爾單相全波無刷直流風(fēng)扇驅(qū)動(dòng)芯片
基于DSP的小型直流風(fēng)扇自動(dòng)化測試系統(tǒng)
采用FanSense TM技術(shù)的PWM風(fēng)扇速度控制器
抗電磁干擾的PWM風(fēng)扇控制器原理及應(yīng)用

pwm控制led亮度原理圖,單片機(jī)PWM控制LED亮度

直流風(fēng)扇和交流風(fēng)扇的基本組成結(jié)構(gòu)?
如何使用Arduino生成的PWM來控制交流風(fēng)扇的速度

基于Arduino制作直流風(fēng)扇速度控制器
用Arduino和紅外遙控器制作直流風(fēng)扇速度控制器

使用Arduino和晶閘管(TRIAC)控制交流風(fēng)扇的速度

風(fēng)扇控制的進(jìn)步:考慮風(fēng)扇速度調(diào)節(jié)

評論