STM32的PWM和DAC練習

asdaaaazzzxxc發表於2021-01-03


一、用STM32F103輸出一路PWM波形

PWM輸出就是對外輸出脈寬(即佔空比)可調的方波訊號,訊號頻率由自動重灌暫存器 ARR 的值決定,佔空比由比較暫存器 CCR 的值決定。PWM 模式分為兩種,PWM1 和 PWM2,總得來說是差不多。

實驗時用的野火自帶的程式碼
在這裡插入圖片描述修改程式碼main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_GeneralTim.h"  

/**
  * @brief  主函式
  * @param  無  
  * @retval 無
  */
int main(void)
{
	/* led 埠配置 */ 
	LED_GPIO_Config();
	
	/* 定時器初始化 */
	GENERAL_TIM_Init();
	
  while(1)
  {      
  }
}

生成hex檔案
在這裡插入圖片描述
燒錄
在這裡插入圖片描述
結果
在這裡插入圖片描述

二、輸出一個週期2khz的正弦波(迴圈)

根據實驗教程
在這裡插入圖片描述我們需要輸出一個週期為2kHz的正弦波,通過計算公式,我們可以得到,一共需要3600個取樣點

開啟野火自帶的正弦波表製作指令碼,生成3600個取樣點,這些點存在.c檔案中

在這裡插入圖片描述
matlab程式碼

%用於產生正弦資料表,輸出到檔案dac_sinWave.c 檔案中,複製到c語言陣列即可

n = 2*pi/3600 : 2*pi/3600 : 2*pi      %分成3600等份

a = sin(n)+1;                     %求取sin函式值並向上平移一個單位,消除負數值
a = a * 3.3/2;                    %調整幅值,使範圍限制為0~3.3   
r = a* (2.^12) /3.3               %求取dac數值,12位dac LSB = 3.3/2.^12 
r = uint16(r);                     %把double型資料轉化成16位整型資料 

for i = 1:32                        
if r(i) > 4095                      %限制資料最大不超過4095
    r(i) = 4095
end
end 

dlmwrite('dac_sinWave.c',r);      %把資料寫入到檔案,方便新增到stm32工程中
plot(n,r,'.')                     %把這些點畫出來 

用matlab生成的點
在這裡插入圖片描述工程檔案
在這裡插入圖片描述
把點數放進uint16_t Sine12bit[POINT_NUM]
在這裡插入圖片描述
燒錄用示波器觀察結果
在這裡插入圖片描述

三、將一段數字音訊歌曲資料轉換為模擬音訊波形輸出

用Adobe Audition開啟一段音訊,設定取樣8khz,量化16bit,單通道,儲存下來
在這裡插入圖片描述

開啟在這裡插入圖片描述開啟檔案,生成程式碼

在這裡插入圖片描述

工程檔案
在這裡插入圖片描述
把點數放進uint16_t Sine12bit[POINT_NUM]
在這裡插入圖片描述
結果
在這裡插入圖片描述

相關文章