天天看點

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

目錄

  • 一、PWM輸出
    • 1.PWM輸出模式
    • 2.相關代碼
    • 3.程式燒錄
    • 4.結果驗證
  • 二、DAC輸出
    • 1.輸出一個周期2khz的正弦波
    • 2.将一段數字音頻歌曲資料轉換為模拟音頻波形輸出

一、PWM輸出

1.PWM輸出模式

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

2.相關代碼

使用了野火自帶的PWM輸出波形工程檔案

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

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檔案

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

3.程式燒錄

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

4.結果驗證

通過PB5觀察到輸出一個矩形脈沖波形

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

二、DAC輸出

STM32F103指南者的DAC輸出通道為PA4和PA5,使用這兩個引腳來觀測輸出波形

基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

1.輸出一個周期2khz的正弦波

  • 正弦波頻率的計算方式:
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
    我們需要輸出一個周期為2kHz的正弦波,通過計算公式,我們可以得到,一共需要3600個采樣點
  • 打開野火自帶的正弦波表制作腳本,生成3600個采樣點,這些點存在.c檔案中
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
    修改為
%用于産生正弦資料表,輸出到檔案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,'.')                     %把這些點畫出來 
           
  • 打開DAC輸出工程,進行修改
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
    将生成的點放入Sine12bit[POINT_NUM]中
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
  • 結果驗證

    燒錄程式後,示波器接PA4、PA5觀察所得結果

    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
    有嘀嘀嘀的聲音,但由于蜂鳴器沒有接三極管和電阻,沒有進行聲音的放大,是以隻有很小的聲音。

2.将一段數字音頻歌曲資料轉換為模拟音頻波形輸出

  • 打開Adobe Audition CS6,裁剪出一段音樂,這裡采用了采樣44100hz,量化16bit,2聲道。
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
  • 轉碼轉為16進制
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
  • 将得到的16進制碼放入Sine12bit[POINT_NUM]中,修改點數為5120
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出
  • 結果
    基于STM32的PWM輸出和DAC輸出一、PWM輸出二、DAC輸出

參考連結:

https://www.cnblogs.com/zhugeanran/p/8542395.html

https://blog.csdn.net/kevin_IoT/article/details/61650516?utm_source=blogxgwz3

https://blog.csdn.net/dcx1205/article/details/9002542?utm_medium=distribute.wap_relevant.none-task-blog-baidujs_title-14

https://blog.csdn.net/qq_36355662/article/details/80606753