一、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