需求:让stm32的DAC输出正弦波形
分析:DAC的原理这里不作过多介绍。在[0,2π]的定义域内对sin(x)的值域进行采样,采样次数为256次;采样结果需要等比例缩放到0~4095的无符号数范围内,并且输出到一个SinFile.txt文本文档之中存放。sin(x)在[0,2π]上的值域为[-1,1],所以需要先整体在y轴向上平移一个单位长度把范围调整为[0,2]。0对应DAC模拟值0,1对应模拟值2048,2对应模拟值4095(精度损失暂时忽略)。
编程:
cpp
#include <stdio.h>
#include <math.h>
#define SampleNUM sNUM //采样点数量
#define OutputVoltage outV //DAC需要的模拟值
#define Pai 3.141592
int main()
{
char* path = "E:\\0_C&C++ Projects\\C\\Sin\\SinData\\SinFile.txt";
FILE* file = fopen(path,"w");
int sNum = 256;
unsigned int outV = 0;
for (int i = 0; i < sNum; i++)
{
outV = (unsigned int)(0.5 * (sin(2 * Pai * i / sNum) + 1) * 4095); //无符号数类型强转
char str[12];
sprintf_s(str,12,"%u", outV); //把无符号数强转变为字符串
fputs(str, file);
fputc(' ',file); //输出1个数要空一格
if(!((i+1)%16)) //每16个数换一下行
fputs("\n", file);
}
fclose(file);
return 0;
}
输出结果:
肉眼看不出来,先用excel验证一下。
数据->获取数据->导入数据;
整行复制到sheet2,选择性粘贴并且转置;
选中第一个数据插入->折线图;
最后excel帮我画的图;
到3/2π那边有点失真。。。采样点多能好点。