利用STM32F103完成PWM和DAC的波形輸出
- 簡介:
- PWM簡介
- DAC簡介
- 一、 用STM32F103輸出一路PWM波形
- (1)實驗要求
- (2)實驗程序
- (3)實驗結果
- 二、用STM32F103的DAC功能完成以下波形輸出
- 1、正弦波觀察
- (1)實驗要求
- (2)實驗程序
- (3)實驗結果
- 2、音頻信號輸出
- (1)實驗要求
- (2)實驗程序
- (3)實驗結果
- 三、總結
- 四、參考文獻
簡介:
PWM簡介
- 定義:
PWM是一種對模擬信號電平進行數字編碼的方法,通過高解析度計數器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼,PWM信號仍然是數字的,因為在給定的任何時刻,滿幅值的直流供電要么完全(ON),要么完全無(OFF),電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的,通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候,只要帶寬足夠,任何模擬值都可以使用PWM進行編碼,
- PWM信號輸出
(1)可以直接通過芯片內部模塊輸出PWM信號,前提是這個I/O口要有集成模塊,只需要簡單幾步操作即可,這種自帶有PWM輸出的功能模塊在程式設計更簡便,同時資料更精確,如下圖,一般的I2C口都會標明這個是否是PWM口
(2)但是如果I2C內部沒有PWM功能模塊,或者要求不是很高的話可以利用I/O口設定一些引數來輸出PWM信號,因為PWM 信號其實就是一高一低的一系列電平組合在一起,具體方法是給I/O加一個定時器,對于你要求輸出的PWM信號頻率與你的定時器一致,用定時器中斷來計數,但是這種方法一般不采用,除非對于精度、頻率等要求不是很高可以這樣實作,
DAC簡介
- STM32上的DAC
數字/模擬轉換模塊(DAC)是12位數字輸入,電壓輸出的數字/模擬轉換器,DAC可以配置為8位 或12位模式,也可以與DMA控制器配合使用,DAC作業在12位模式時,資料可以設定成左對齊或右對齊,DAC模塊有2個輸出通道,每個通道都有單獨的轉換器,在雙DAC模式下,2個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新2個通道的輸出,DAC可以通過引腳輸入參考電壓VREF+以獲得更精確的轉換結果,
- DAC的主要技術指標
1 .解析度指輸出模擬電壓的最小增量,即表明DAC輸入一個最低有效位(LSB)而在輸出端上模擬電壓的變化量,
2. 建立時間是將一個數字量轉換為穩定模擬信號所需的時間,也可以認為是轉換時間,DA中常用建立時間來描述其速度,而不是AD中常用的轉換速率,一般地,電流輸出DA建立時間較短,電壓輸出DA則較長,
3 .精度是指輸入端加有最大數值量時,DAC的實際輸出值和理論計算值之差,它主要包括非線性誤差、比例系統誤差、失調誤差,
4 .線性度在理想情況下,DAC的數字輸入量作等量增加時,其模擬輸出電壓也應作等量增加,但是實際輸出往往有偏離,
一、 用STM32F103輸出一路PWM波形
(1)實驗要求
- 用STM32F103輸出一路PWM波形,建議采用定時器方法
- 用示波器觀察輸出波形
(2)實驗程序
該實驗參考正點原子資料A盤:PWM輸出實驗
- 實驗主要代碼:
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;
}
}
//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//設定該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //設定在下一個更新事件裝入活動的自動重裝載暫存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設定用來作為TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設定時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的引數初始化TIMx的時間基數單位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根據T指定的引數初始化外設TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝載暫存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
主函式:
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);
}
}
- KEIL仿真的配置


- 依次點擊
Run

- 點擊
Stop

(3)實驗結果
- PWM輸出波形如下

二、用STM32F103的DAC功能完成以下波形輸出
該實驗是基于野火資料配套代碼
DAC—輸出正弦波上完成的
1、正弦波觀察
(1)實驗要求
- 輸出一個周期2khz的正弦波(回圈),此波形驅動作用至蜂鳴器或喇叭,會呈現一個“滴…”的單音
(2)實驗程序
- 根據公式計算得到一共需要3600個采樣點

- 用
MATLAB打開此腳本,當然你也可以選擇用Python

- 修改如下代碼

- 運行腳本,會產生3600個采樣點,產生的點會自動保存在
dac_sinWave檔案中

- 將這些采樣點復制,然后全部粘貼到KEIL工程里面的
uint16_t Sine12bit陣列中

- 用開發板引腳
PA4與示波器相連,觀察波形
(3)實驗結果

2、音頻信號輸出
(1)實驗要求
- 將一段數字音頻歌曲資料轉換為模擬音頻波形輸出(回圈),
(2)實驗程序
- 打開
Adobe Audition CS6,選擇你最喜歡的歌曲并打開 - 截取一段音頻不要太長5-10秒足矣
- 在截取的區域右鍵單擊

- 進行如下配置

-
配置后保存為WAV檔案

-
用
UltraEdit打開剛剛的.wav檔案

-
選擇范圍后復制

-
用
Notepad打開,復制剛剛所選內容 -
快捷鍵:
ALT+C,添加0x和,

-
添加后如下圖

-
這里要洗掉尾行無用的
0x,這是因為剛剛在選擇復制范圍不合理的原因照成

-
復制上面的資料,粘貼到KEIL工程的
uint16_t Sine12bit[]陣列中去 -
運行下載程式,將開發板引腳PA4與示波器相連即可觀察波形
(3)實驗結果

三、總結
在UltraEdit里面選擇截圖范圍的時候要合理選取,我第一次因為選的稍大,導致后面有很多分號,手動去除比較麻煩,畢竟有6000多行,所以可以稍微選擇小一點,然后在Notepad里面對列同時操作效率更高,
實驗學習了PWM和DAC輸出波形的相關知識,了解了各種配置,識訓許多,為今后的學習打下良好基礎
四、參考文獻
[1]PWM簡介
[2]STM32PWM輸出實驗
[3]DAC簡介
[4]STM32F103使用TIM DMA DAC實作播放WAV音樂
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244352.html
標籤:其他
上一篇:MTC機器型別通信

