目錄
- 一、PWM輸出
-
- 1.PWM輸出模式
- 2.相關代碼
- 3.程式燒錄
- 4.結果驗證
- 二、DAC輸出
-
- 1.輸出一個周期2khz的正弦波
- 2.将一段數字音頻歌曲資料轉換為模拟音頻波形輸出
一、PWM輸出
1.PWM輸出模式
PWM輸出就是對外輸出脈寬(即占空比)可調的方波信号,信号頻率由自動重裝寄存器 ARR 的值決定,占空比由比較寄存器 CCR 的值決定。PWM 模式分為兩種,PWM1 和 PWM2,總得來說是差不多。
2.相關代碼
使用了野火自帶的PWM輸出波形工程檔案
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檔案
3.程式燒錄
4.結果驗證
通過PB5觀察到輸出一個矩形脈沖波形
二、DAC輸出
STM32F103指南者的DAC輸出通道為PA4和PA5,使用這兩個引腳來觀測輸出波形
1.輸出一個周期2khz的正弦波
- 正弦波頻率的計算方式: 我們需要輸出一個周期為2kHz的正弦波,通過計算公式,我們可以得到,一共需要3600個采樣點
- 打開野火自帶的正弦波表制作腳本,生成3600個采樣點,這些點存在.c檔案中 修改為
%用于産生正弦資料表,輸出到檔案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輸出工程,進行修改 将生成的點放入Sine12bit[POINT_NUM]中
-
結果驗證
燒錄程式後,示波器接PA4、PA5觀察所得結果
有嘀嘀嘀的聲音,但由于蜂鳴器沒有接三極管和電阻,沒有進行聲音的放大,是以隻有很小的聲音。
2.将一段數字音頻歌曲資料轉換為模拟音頻波形輸出
- 打開Adobe Audition CS6,裁剪出一段音樂,這裡采用了采樣44100hz,量化16bit,2聲道。
- 轉碼轉為16進制
- 将得到的16進制碼放入Sine12bit[POINT_NUM]中,修改點數為5120
- 結果
參考連結:
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