stm32 DAC输出任意形状的波形-任意波形发生器
代码:https://download.csdn.net/download/dh1151313194/20376311
(代码不值钱,大热天的,9.9就当请我吃个西瓜吧,毕竟写这么多也不容易,哈哈)
开发板:任意ST的nucler-64板子
软件:crubeMX KEIL
核心思想:
-
事先准备好一个数组,这个数组保存的是你要显示的波形,数组的成员大小是0-4095(DAC的精度可以最大到4095),
-
然后按照一定的时间,用DMA的方式,吧这个数组的值搬到DAC的数据寄存器,
-
然后DAC的引脚电平就按照这个数组变化。
1 首先配置DAC 1.1 DAC引脚输出
1.2 波形输出模式关闭
硬件自带的波形输出只是包括三角波和噪声波两种,所以这里要关闭。
1.3 DMA配置
2 定时器2部分的设置
2.1 定时器时钟源选择为内部时钟
选择内部时钟源
2.2 定时器2的输出作为DAC的激发
硬件的初始化基本是OK了,现在主要是准备好波形的一维数组,这里的函数作用是生成一个周期的正选波形
#include<math.h>
#define PointMax 500 //数组大小是500
#define PI 3.1415926 //
unsigned int sinData[PointMax] = {0};//正旋波数据
void get_sin_tab( unsigned int point )
{
unsigned int i = 0, j = 0;
float hd = 0.0; //弧度
float fz = 0.0; //峰值
unsigned int tem = 0;
j = point / 2;
hd = PI / j;
for( i = 0; i < point; i++ )
{
fz = j * sin( hd * i ) + j;
tem = ( unsigned int )fz;
sinData[i] = tem*8;//赋值设定在0~4095
}
}
3 软件编程,生成正旋波
3.2 启动定时器2,启动DAC的DMA
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)sinData, 500,DAC_ALIGN_12B_R);
3.3 最终效果图
4 生成三角波
这里是生成三角波的DAC数据 DualSine12bit_sanjiao。
uint32_t DualSine12bit_sanjiao[500];
for (Idx = 0; Idx < 250; Idx++)
{
DualSine12bit_sanjiao[Idx]=Idx*8;
}
for (Idx = 250; Idx < 500; Idx++)
{
DualSine12bit_sanjiao[Idx]=(500-Idx)*8;
}
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)DualSine12bit_sanjiao, 500,DAC_ALIGN_12B_R);
5 软件编程,生成方波
//生成方波
for (Idx = 0; Idx < 250; Idx++)
{
DualSine12bit_fangbo[Idx]=0;
}
for (Idx = 250; Idx < 500; Idx++)
{
DualSine12bit_fangbo[Idx]=4095;
}
HAL_TIM_Base_Start(&htim2);
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)DualSine12bit_fangbo, 500,DAC_ALIGN_12B_R);