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

编程:

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π那边有点失真。。。采样点多能好点。

相关推荐
凤年徐2 分钟前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
Chef_Chen4 分钟前
从0开始学习R语言--Day40--Kruskal-Wallis检验
开发语言·学习·r语言
鑫宇吖7 分钟前
Polyspace作为MISRA-C合规性检查工具,其检查规则会根据目标C语言标准(C90或C99)动态调整限值要求。
c语言·嵌入式·c99·c90·polyspace·misra-c合规性检查
Zhu_S W10 分钟前
深入理解Java虚拟机:Java内存区域与内存溢出异常
java·开发语言·jvm
灰海15 分钟前
原型与原型链到底是什么?
开发语言·前端·javascript·es6·原型模式·原生js
鸡蛋灌Bean32 分钟前
Java常用设计模式大全
java·开发语言·设计模式
钮钴禄·爱因斯晨44 分钟前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
wkj0011 小时前
php中array($this, ‘loadClass‘)表示啥意思?
android·开发语言·php
Stuomasi_xiaoxin1 小时前
服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录
开发语言·python·github
presenttttt1 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(四)
开发语言·python·opencv·计算机视觉