在之前的文章中,我們已經了解了使用 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)
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的圖片圖:
引腳(IN1 到 IN7)是輸入引腳,(OUT 1 到 OUT 7)是相應的輸出引腳。COM 是負載的正極電壓。
電位器:使用兩個電位器,一個用于分壓器,用于模拟輸入到 ADC,另一個用于控制 LED 的亮度。
STM32的管腳細節
我們可以看到 PWM 引腳以波浪線(~) 表示,有 15 個這樣的引腳;有 10 個 ADC 引腳用于模拟輸入,ADC 引腳以綠色标出。
電路圖和連接
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)
>整體電路
編程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每日頭條,我们将持续为您更新最新资讯!