文章目錄
- 前言
- PWM簡介
- 輸出PWM波形
-
- 燒錄 PWM 例程
- 在Keil中檢視PWM波形
- 示波器中觀察波形
- DAC簡介
- 輸出DAC波形
-
- 輸出DAC正弦波
- 輸出DAC音頻
- 總結
前言
本篇文章簡單介紹了PWM波形輸出的基本原理和DAC波形輸出的基本原理,在Keil5中如何觀察輸出波形,以及在示波器中觀察波形。
PWM簡介
脈沖寬度調制( PWM),是英文 Pulse Width Modulation 的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模拟電路進行控制的一種非常有效的技術 。簡單一點,就是對脈沖寬度的控制。
我們要利用TIM3 的 CH2 輸出 PWM 來控制 DS0 的亮度,要使用TIM3,我們必須先開啟 TIM3 的時鐘,這點相信大家看了這麼多代碼,應該明白了。這裡我們還要配置 P B5 為複用輸出,這是因為 TIM3_CH2 通道 将重映射到 PB5 上,此時, PB5屬于複用功能輸出 。
輸出PWM波形
- 晶片:STM32F103ZET6
- 環境:Keil5
- 例程:正點原子官方例程
燒錄 PWM 例程
主要函數:
Tips:這裡給出的是定時器3(即Time3)的函數。
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能
TIM_TimeBaseStructure.TIM_Period = arr; //設定在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數到5000為500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設定用來作為TIMx時鐘頻率除數的預分頻值 10Khz的計數頻率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設定時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數機關
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級0級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級3級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外設
}
//定時器3中斷服務程式
void TIM3_IRQHandler(void) //TIM3中斷
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
LED1=!LED1;
}
}
定時器的函數中包含了定時器初始化的函數,以及定時器中斷服務函數。
- 顯而易見,定時器初始化函數就是實作了定時器的初始化工作;
- 中斷服務函數裡面就實作了開啟定時中斷後需要執行的任務。
以上函數都是正點原子官方庫給出的定時器的例程,此函數一般在例程中會有,是以不會自己編寫。
主函數:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(115200); //序列槽初始化為115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(899,0); //不分頻。PWM頻率=72000000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
主函數裡的内容主要編寫的是變化輸出的PWM波形。利用延時函數實作波形的變化。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUDO3ATM1ADM0ATMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
函數分析:
延時10毫秒之後,對變量進行加一操作,直到變量值達到300之後,再将變量值置為0,重新開始計數。這樣就可以實作輸出的PWM波形占空比的變化。
在Keil中檢視PWM波形
在小魔術棒中進行如下配置
點選調試
點選設定
進行如下設定
注意:不同的闆子輸出PWM波形的引腳可能不一樣,這裡的配置也會不一樣。
配置完成之後,可以觀察到波形。
示波器中觀察波形
OK!完成PWM波形的輸出。
DAC簡介
STM32的 DAC 子產品 數字 模拟轉換子產品 是 12 位數字輸入,電壓輸出型的 DAC。
STM32的 DAC 子產品主要特點有:
- 2 個 DAC 轉換器:每個轉換器對應 1 個輸出通道
- 8 位或者 12 位單調輸出
- 12 位模式下資料左對齊或者右對齊
- 同步更新功能
- 噪聲波形生成
- 三角波形生成
- 雙 DAC 通道同時或者分别轉換
- 每個通道都有 DMA 功能
設定 DAC 子產品的通道 1 來輸出模拟電壓,其詳細設定步驟如下:
- 開啟 PA 口時鐘,設定 PA4 為模拟輸入。
- 使能 DAC1時鐘。
- 初始化 DAC, 設定 DAC 的工作模式。
- 使能 DAC 轉換通道。
- 設定 DAC 的輸出值。
輸出DAC波形
- 晶片:STM32F103ZET6
- 環境:Keil5
- 例程:正點原子官方例程
輸出DAC正弦波
首先,需要先用軟體生成一個2KHz的正弦波
這裡使用的是Adobe Audition CS6這個軟體。
點選建立一個檔案
設定相關參數
點選“效果”,“生成基本音色”
設定頻率為2KHz
生成波形為2KHz正弦波
導出為wav檔案
利用程式将WAV檔案生成.c檔案
點選打開檔案并選擇所需要轉換的檔案
左邊的參數就會自動生成,點選生成代碼并儲存代碼
生成代碼如下圖所示
将生成的C語言代碼放到程式當中去
即可生成正弦波,以下是用示波器觀察結果。
輸出DAC音頻
輸出音頻的步驟與輸出正弦波的步驟是類似的,是以這裡不再重複過多步驟。
給出以下不同的部分。
生成音頻wav檔案
生成WAV檔案後轉換成.c檔案
輸出波形
總結
PWM波形的輸出是利用定時器3來控制輸出的,輸出引腳為PB5。需要觀察PWM波形的時候,需要根據相關規則配置PB5來觀察波形。在用示波器觀察波形的時候,需要一個引腳連接配接PB5,一個引腳接地,這樣的波形會更加平穩。
DAC輸出波形的引腳為PA4。DAC簡單來說就是将數字輸出轉換成模拟輸出。