身价过亿的温柔萝莉对小码农说adc会采集吗(代码片段)

小码农U 小码农U     2023-02-05     243

关键词:


小码农电压使者怎么敢说不会采集

模拟量—>数字量(ADC模块)

模拟量与单片机的数字量之间的关系

5V 单片机 CPU 电路是二进制的,运算过程中,电压只有2种:高电平 5V 和低电平 0V 。对于电压或者电流连续变化的信号,就需要通过模数转换电路,变成单片机可以识别的数字电平信号。 MP3 就是用 ADC 采样保存的失真文件。

模拟量转换成数字的方式

模拟量变成数字量,通常都是用比较器来负责转换。目前来说,常见的有两种方式,一种是并行比较,一种是逐次比较

**并行比较器:**速度比较快,但是采用的元件非常非常多。成本会非常高。所以,实用性不是很广泛

**逐次比较器:**通过反馈控制,多次运算后,转换出结果。具有成本低、元件简单等优势,而且容易做出高精度的转换器,所以被广泛使用。

逐次比较器ADC的概念

一个超级好的例子分享给你们

先来玩个游戏 :狗蛋拿了些花生米,跟你说,想吃就要先猜对有多少个。告诉你最多是 255 颗,你猜的时候,可以告诉你多了或者少了。那么,怎么猜才能最快猜出花生米的数量?
猜的时候,为了方便计算, 我们多加 0.5 颗花生米。
==第一步:==猜 255 ÷ 2 +0.5=128. 狗蛋告诉你,多了 (0) 。
第二步:猜 128 ÷ 2=64. 狗蛋告诉你,少了 (1)。
第三步:猜 (128 + 64) ÷ 2=96. 狗蛋 告诉 你,多了 (0) 。
第四步:猜 (96 + 64) ÷ 2=80. 狗蛋 告诉 你,少了 (1) 。
第五步:猜 (96 + 80) ÷ 2=88. 狗蛋 告诉 你,少了(1)。
第六步:猜 (96 + 88) ÷ 2=92. 狗蛋 告诉 你,多了(0)。
第七步:猜 (92+ 88) ÷ 2=90. 狗蛋 告诉 你,多了(0) 。
第八步:猜 (90+ 88) ÷ 2=89. 狗蛋 告诉 你,猜对 (?) 。
得出结果: 如果不加 0.5 ,实际计算公式得结果是 88.65234375 。实际上88.65比89小所以是 1
四舍五入, 89>88.65, 取 ?= 1 ;得出结果就是 0 1 0 1 1 0 0 1 =89=0x59;

STC内部ADC模块的寄存器

1.ADC口配置成ADC输入模式或者高阻模式

2.ADC控制寄存器:ADC_CONTR.控制电源,转换速度,标志位,启动位,通道选择[2:0]

3.ADC采样结果输出寄存器ADC_RES,ADC_RESL。可以是[1:0]+[7:0],也可以是[7:0]+[1:0].

4.ADC转换,跟中断有关的寄存器IE

5.辅助寄存器AUXR1,主要是控制结果寄存器的存储格式

这里我们需要采集电池电压(我们用P1.0采集)

我是准备用ADC0来检测电池电压的,具体看老师需求,然后把示数显示到数码管上面,因为之前我出过数码管博客,大家可能还有点印象,不知道的看真正的数码管

P1M1 |= 0x01;P1M0 &= ~0x01;//P1.0脚ADC0

P1ASF |= 0x01;

CLK_DIV |= 0x20;

ADC_RES = 0;ADC_RESL = 0;

ADC初始化

//ADC初始化
void ADC_Init()

	P1M1 |= 0x0f;
	P1M0 &= ~0x0f;//P1.0脚ADC0
	P1ASF |= 0x0f;
//	P1M1 |= 0x02;
// 	P1M0 &= ~0x02;//P1.1脚ADC1
//	P1ASF |= 0x02;
	CLK_DIV |= 0x20;
	ADC_RES = 0;
	ADC_RESL = 0;

ADC_CONTR = 0x88;

ADC读数据底层驱动

//ADC读数据底层驱动
void ADC_Read_Data_Drive()

	//转换之前先把转换结果寄存器清零
	ADC_RES = 0;
	ADC_RESL = 0;
	//启动转换
	ADC_CONTR = 0x88;//转换速度我用最慢的
	//等到ADC_FLAG为1
	while(!(ADC_CONTR&0x10));
	//然后把数据传到缓存变量里面去
	ADC_Read_Data = ADC_RES<<8;
	ADC_Read_Data = ADC_Read_Data+ADC_RESL;	

演示视频

采集电压

采集电压

ADC代码

ADC_Drive.c(还有一个我自己写的滤波函数,使得数据稳定)基本这个水平可以拿省二了

#include "all.h"


//有数据那我们就得存
u16 xdata ADC_Read_Data = 0;
u16 xdata ADC_Filter_Data = 0;

//ADC初始化
void ADC_Init()

	P1M1 |= 0x0f;
	P1M0 &= ~0x0f;//P1.0脚ADC0
	P1ASF |= 0x0f;
//	P1M1 |= 0x02;
// 	P1M0 &= ~0x02;//P1.1脚ADC1
//	P1ASF |= 0x02;
	CLK_DIV |= 0x20;
	ADC_RES = 0;
	ADC_RESL = 0;


//ADC读数据底层驱动
void ADC_Read_Data_Drive()

	//转换之前先把转换结果寄存器清零
	ADC_RES = 0;
	ADC_RESL = 0;
	//启动转换
	ADC_CONTR = 0x88;//转换速度我用最慢的
	//等到ADC_FLAG为1
	while(!(ADC_CONTR&0x10));
	//然后把数据传到缓存变量里面去
	ADC_Read_Data = ADC_RES<<8;
	ADC_Read_Data = ADC_Read_Data+ADC_RESL;	


//全局的ADC滤波数据结构体指针
ADC_Data* adc_filter;

//ADC滤波数据底层驱动
void ADC_Filter_Data_Drive()
	
	
	/*u16  ADC_Min = 0;
	u16  ADC_Max = 0;
	u16  ADC_Tmp = 0;
	u16  ADC_Result = 0;*/
	
	//设置两个循环变量
	u8 i = 0;
	u8 j = 0;
	ADC_Filter_Data = 0;
	ADC_Read_Data_Drive();
	for(i = 0;i<4;i++)//外层8次循环
	
		adc_filter->ADC_Result = 0;
		adc_filter->ADC_Min = 
		adc_filter->ADC_Max = 
		ADC_Read_Data;
		for(j = 0;j<4;i++)//内层8次循环
		
			adc_filter->ADC_Tmp = ADC_Read_Data;
			if (adc_filter->ADC_Tmp < adc_filter->ADC_Min) 
			
				adc_filter->ADC_Result += adc_filter->ADC_Tmp;
				adc_filter->ADC_Min = adc_filter->ADC_Tmp;
			
			else if (adc_filter->ADC_Tmp > adc_filter->ADC_Max) 
			
				adc_filter->ADC_Result += adc_filter->ADC_Tmp;
				adc_filter->ADC_Max = adc_filter->ADC_Tmp;
			
			else 
			
				adc_filter->ADC_Result += adc_filter->ADC_Tmp;
							
		
		adc_filter->ADC_Result /= 4;
		ADC_Filter_Data += adc_filter->ADC_Result;
	
	  ADC_Filter_Data /= 4;

ADC_Drive.h

#ifndef ADC_Drive
#define ADC_Drive

typedef struct ADC_Filter_Data

	u16  ADC_Min;      //ADC最小值
	u16  ADC_Max;      //ADC最大值
	u16  ADC_Tmp;      //ADC临时值
	u16  ADC_Result;   //ADC结果
 ADC_Data;

//外部声明
extern void ADC_Init();
extern void ADC_Read_Data_Drive();
extern void ADC_Filter_Data_Drive();
extern u16 xdata ADC_Read_Data;
extern u16 xdata ADC_Filter_Data;
#endif

身价过亿的女王对小码农说中断会了吗

文章目录为了女王,咳咳,为了知识敢说中断不会吗?==联动文章[身家过亿的帝都富豪对小码农说你时空复杂度会了吗](https://blog.csdn.net/diandengren/article/details/120736416?spm=1001.2014.3001.5502)==单片机的中断系... 查看详情

身价过亿的冰山御萝对小码农说你液晶能显示吗(代码片段)

...,为了知识怎么敢说液晶不显示啊==联动文章[身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗](https://blog.csdn.net/diandengren/article/details/120619762?spm=1001.2014.3001.5501)====我们要清楚液 查看详情

身价过亿的帝都富豪对小码农说预处理学的不错(代码片段)

...序环境和预处理==**帝都富豪与富家总裁联动文章[身价过亿的女总裁对小码农说你按键会了吗](https://blog.csdn.net/qq_42832862/article/details/120678330?spm=1001.2014.3001.5502)**==程序的翻译环境和执行环境详解编 查看详情

身价过亿的冰山御萝的姐姐对小码农说你有大一点的液晶吗(代码片段)

...样小的液晶呢,我不应该大一点吗==联动文章[身价过亿的冰山御萝对小码农说你液晶能显示吗](https://blog.csdn.net/qq_42832862/article/details/120619604?spm=1001.2014.3001.5501)= 查看详情

身价过亿的贤淑才女对小码农说pwm可以控制时间长短吗(代码片段)

文章目录为了贤淑妻子,咳咳,贤淑才女,小码农必定让PWM控制时间什么是脉宽调制PWMSPWM简介用定时器和CPU模拟PWM输出新建工程设置一个定时器,定时10us定时器中断服务函数里面,驱动P2.1脚输出PWM==我... 查看详情

身价过亿的妖媚子对小码农说串口能传送我的爱吗?(代码片段)

文章目录小码农不敢接受妖媚子(想多活几年),但是串口还是可以传送数据的并行通信串行通信==同步:====异步:==串口通信:收发一个字节(只能用时间来同步)串口通... 查看详情

算法大神对小码农说环形链表可以单独拿出来讲讲(代码片段)

文章目录环链环形链表题目分析延伸问题:==1.为什么fast和slow会在环中相遇,会不会有这么一种情况呢。就是在环中一直交错永远遇不上?请证明一下。==证明:==这里就又衍生出了一个问题就是... 查看详情

身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇(代码片段)

文章目录身家过亿的帝都太子妃参加1024盛典,小码农弟弟为他献上定时器一篇内部定时器/计数器中断1.定时/计数器的概念==核心图==定时1ms1.时钟12分频(我们使用传统51的速度)T0x12=0(也就是AUXR&am... 查看详情

身家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典(代码片段)

文章目录身家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典顺序表的缺陷链表链表的概念及结构链表的分类**1.单向或者双向****2.带头或者不带头****3.循环或者非循环**链表的实现无头单向单链表节... 查看详情

身价过亿的灵仙子说你iic没写完也发?

文章目录小码农很硬气说没写完发咋了,你咬我啊I^2^C协议的简单应用I^2^C协议总体概述I^2^C协议规则==I^2^C协议的数据有效性====I^2^C协议的起始信号、停止信号====I^2^C协议的通讯格式==I^2^C协议的数据读写三种方式I^2^C协议单向发... 查看详情

ce感恩品牌创始人,一个身价过亿的青年企业家

  希文,GE感恩品牌的创始人,90年出生于江苏的一个商业世家。由于自小受到家族的熏陶,希文早早地学会了独立。在他成就自己事业的时候,虽然没有得到家族的支持,但母亲一直教导他把感恩当成自己事业的核心。... 查看详情

算法给小码农topk重瞳双目(代码片段)

文章目录Topk1000个数中找到最大的前十个方式1:方式2:==方式3:==Topk打印函数TopkPrint没有修改的接口见[算法给小码农堆魂器--铁血柔情](https://blog.csdn.net/diandengren/article/details/121218819?spm=1001.2014.300 查看详情

从高中缀学到身价过亿,这个80后值得喝彩!

这是微笑哥8月第2次人物分享。全文6600字,阅读请谨慎。作者|云游小生来源 | 纯洁的微笑转载授权(ID:keeppuresmile)一向怼天怼地的罗永浩,少有人能入他的眼。李想被怼上热搜,老罗头顶着炸药包就上:... 查看详情

esp32adc1采集是正常的,adc2采集数据都是3.3,这是怎么回事?谁有关于adc2操作的代码吗?

我用adc1的6、7通道采集电压电流,数据是有变化的,但是用adc2采集数据时都是采集到满值,一点变化都没有,谁来帮帮检查下你的wifi的状态,是否初始化,是否采样在关闭wifi后,或者是wifi初始化中间。按照api手册里说的,adc2... 查看详情

算法开启小码农双链表血脉(代码片段)

文章目录==也欢迎大家能来到我们小伙伴的社区[慧编程开源俱乐部](https://bbs.csdn.net/forums/mzt)==双链表双链表结构图双链表节点双链表初始化函数ListInit双链表尾插函数ListPushBack双链表打印函数ListPrint双链表尾删函数Lis... 查看详情

算法开启小码农栈血脉(代码片段)

栈栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原... 查看详情

算法开启小码农队列血脉(代码片段)

队列队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一... 查看详情

如何证明javascript中函数参数都是值传递(代码片段)

二话不说,上代码functionsetName(obj)obj.name='小码农';letcoder=newObject();setName(coder);console.log(coder.name);//小码农代码很简单,那我们思考下这里的obj和coder是什么关系?我们把问题陈述详细点。我们都知道JavaScript... 查看详情