C语言补习课番外篇——采样sin(x)

需求

让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(精度损失暂时忽略)。

编程

#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;
}

输出结果:

74c14178f2974c10b5db49676aa18b45.png

肉眼看不出来,先用excel验证一下。

数据->获取数据->导入数据;

4866f9e88b254bd297be89d8d1d3ca72.png

整行复制到sheet2,选择性粘贴并且转置;

e6d366bbe3a4436db2aa6c37a9599604.png

选中第一个数据插入->折线图;

01816f378e284c72a54af178dca27dd9.png

最后excel帮我画的图;

d3287d3f2df54e7aa95812fcd68cb228.png

到3/2π那边有点失真。。。采样点多能好点。

补充

这段时间一有空就在调试这个东西,总结出下面几点心得:

①stm32的模拟电源Vref是决定DAC输出、ADC采集是否精准的重要影响因素,如有条件最好使用专门的模拟电压基准芯片与数字电源隔开,如若条件不允许,则至少使用Π型滤波器隔开模拟电源与数字电源。

②stm32的DAC输出带载能力有限,直接接上模拟开关和运算放大电路可能会出现各种信号失真(削峰、平谷)等等,所以最好用电压跟随器隔开单片机的DAC输出管脚和后级电路。

③如果上述信号失真现象已经是既定事实,并且硬件电路没有修改可能,那么软件找补的方法是缩放DAC模拟值区间,原来用[0,4095]区分可以等比缩放至[410,3685]之类。电压的放大倍数也需要仔细调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值