蓝桥杯单片机PCF8591芯片ADC与DAC运行冲突解决

news/2024/5/17 5:43:28/文章来源:https://blog.csdn.net/qq_64257614/article/details/130996285

单片机型号:STC15F2K60S2

目录

文章附上工程下载地址:

在进行ADC与DAC测试时发现了如下冲突:

实验问题发现:

解决方案:


文章附上工程下载地址:

https://download.csdn.net/download/qq_64257614/87854725?spm=1001.2014.3001.5503

在进行ADC与DAC测试时发现了如下冲突:

ADC与DAC都运行,即使安排了不同的开启时间,但DAC输出电压有明显抖动。

实验问题发现:

如下代码写了PCF8591芯片在不同时间段开启 ADC与DAC

ADC采集电位器的模拟值,

DAC是将一个变量value(大小在0~100之间)做转化,

(0输出0V,100输出5V,一次函数关系作输出)

然后转化为电压输出.

按键S4 S5分别可对value进行加减操作

u8 nr1,nr2,nr3,nr4,nr5,nr6,nr7,nr8;float read_ADC;                  //浮点ADC读取
u16 ADC_value;                   //ADC读取变量
u8 DAC_value;                    //DAC输出变量
u8 value;u8 DAC_cnt;
u16 ADC_cnt;
bit DAC_flag;
bit ADC_flag;bit key_flag = 0;
u8 key_value;
u8 key_cnt;void main()
{inint();while(1){if(key_flag==1)              //按键S4 S5改变value  大小{key_flag=0;key_value=key_scan_return();switch(key_value)         {case 4:value++;break;case 5:value--;break;}}if(ADC_flag==1)								//ADC采样{ADC_flag=0;read_ADC=ADC_pcf8591(0x03);ADC_value=(unsigned int)read_ADC*100;}if(DAC_flag==1)               //DAC输出{DAC_flag=0;DAC_value=value * 255 /100 ;dac_pcf8591(DAC_value);}}
}void inint()
{cls_buzz_led();inint_smg();Timer0Init();
}void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;					//定时器时钟12T模式TMOD &= 0x01;	TL0 = 0x18;		 TH0 = 0xFC;		  TF0 = 0;		 TR0 = 1;		   EA=1;ET0=1;
}void Timer0_server() interrupt 1
{u8 i;if(++i==8) {i=0;nr1=value/100%10;nr2=value/10%10;nr3=value%10;nr4=17;nr5=17;nr6=17;nr7=17;nr8=17;smg_display(nr1,nr2,nr3,nr4,nr5,nr6,nr7,nr8);}if(++key_cnt==16)  {key_cnt=0;key_flag=1;}if(++DAC_cnt==166) {DAC_cnt=0;DAC_flag=1;}if(++ADC_cnt==450) {ADC_cnt=0;ADC_flag=1;}
}

从中我们发现,即使我们将DAC定位166ms一次转化输出

ADC为450ms一次转化输出,但下载后发现,

DAC的电压输出依旧收到了干扰:

 为证明确实是ADC与DAC相互作用的冲突,我注释掉了ADC采样的代码

 在此编译下载进了开发板,发现DAC输出变得正常了,十分稳定:

在此后的实验中发现,不论是将ADC采样延长,

还是设定标志位,让一个读取完了再开启另一个,都没有成效。

但有一点可以确定的是,ADC与DAC的使用,确实是需要在不同时间段进行的

解决方案:

 在CT107D单片机上,PCF8591三个硬件引脚地址均接地,两路模拟信号均为单端输入,则有:

光敏传感器接在AIN1即通道1,控制寄存器应该写入0x01

电位器Rb2接到AIN3即通道3,控制寄存器应该写入0x03

以上为ADC单独使能用的地址,

照常理来说,我们调用ADC函数时,只需将参数 channel 填为0x01 或 0x03即可:

但我在查阅网上资料后,发现在ADC采样同时,也能使能DAC的地址,

就比如我想读取电位器的0x03的ADC采样值,我把这个地址写成0x43

(即将channel改填为0x43)

这样就能既不影响ADC采样,DAC输出也变得稳定许多:

//ADC读取unsigned char ADC_pcf8591(unsigned char channel)
{unsigned char ad_value,i;for(i=0;i<2;i++){I2CStart();I2CSendByte(0X90);I2CWaitAck();I2CSendByte(channel);I2CWaitAck();I2CStart();I2CSendByte(0X91);I2CWaitAck();ad_value=I2CReceiveByte();I2CSendAck(1);    //官方驱动少这句I2CStop();}return ad_value;
}

 DAC输出函数地址就是固定的0x40:

void dac_pcf8591(unsigned char dat)   //DAC输出 dat - 输入进行数模转换的数据
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);  //DAC输出模式IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}

如此改动之后,我们发现DAC输出变得稳定,在串口测试ADC等数据也十分正常:

 这样我们的问题就解决了,觉得有用就三连!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_688083.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

总结了几百个ChatGPT模型的调教经验,确定不来看看?

目录 前言 chatgpt调教指南 提示词 1.清晰的问题或请求&#xff1a; 2.上下文设置&#xff1a; 3.具体的主题或领域&#xff1a; 4.陈述性问题&#xff1a; 5.追问和澄清&#xff1a; 6.限定问题范围&#xff1a; 角色扮演 充当 Linux 终端 担任产品经理 充当 SQL…

chatgpt赋能python:使用Python编写数据接口:如何让您的网站更具吸引力和效率

使用Python编写数据接口&#xff1a;如何让您的网站更具吸引力和效率 在当今数字时代&#xff0c;大多数公司都希望能够从用户生成的数据中收集和分析信息&#xff0c;以了解他们的客户群体并提高他们的营销策略。为此&#xff0c;开发数据接口成为了一项对于互联网公司不可或…

Java程序设计入门教程 -- 一维数组

目录 一维数组创建 1.声明数组 2.分配数组内存空间 3.数组元素访问 数组初始化 1.静态初始化 2.动态初始化 一维数组的拷贝 1.数组元素的拷贝 2.数组名的拷贝 一维数组创建 1.声明数组 声明一个一维数组的方法很简单&#xff0c;格式如下&#xff1a; 数据类型名[ ] …

茅塞顿开的C#代码——通用型科学计算器

计算器是经常遇到的编程作业。 一般都是实现加、减、乘、除四则运算的普通计算器。 这里介绍用几十行C#代码实现的复杂的《科学计算器》&#xff0c;可以计算各种函数。 不知道其他语言实现同样的功能需要编写多少行代码&#xff1f;20000行&#xff1f; using System; usin…

Linux LNMP(Linux NGINX MySQL PHP)

NGINX处理静态页面性能出色&#xff0c;但是动态页面几乎没有处理能力&#xff0c;比Apache还差 所以涉及动态页面的场合一般由PHP Python Java&#xff08;后缀php&#xff0c;py&#xff0c;jsp&#xff09;等处理 静态页面请求 客户端 -> nginx动态页面请求 …

《水经注地图服务》下载与安装步骤

概述 《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像&#xff0c;从而使…

chatgpt赋能python:Python几次方介绍

Python几次方介绍 Python是一种通用编程语言&#xff0c;具有快速开发和易于阅读的优点。Python具有各种强大的功能&#xff0c;包括能够计算数值的能力。本文将介绍Python几次方的相关知识。 Python几次方的语法 要在Python中进行几次方运算&#xff0c;可以使用双星号&…

亚马逊云科技与涂鸦智能持续赋能开发者,推动全行业的数智化创新

近几年&#xff0c;智能产品已渗透至人们生活的方方面面&#xff0c;IoT技术市场规模也随之获得较快增长&#xff0c;据IoT Analytics的数据&#xff0c;2023年IoT市场规模将增长19%&#xff0c;或成为经济波动周期的一大黑马赛道&#xff0c;但下游应用场景与需求的高度碎片化…

chatgpt赋能python:Python利用数据可视化出图,为SEO拓展新思路

Python利用数据可视化出图&#xff0c;为SEO拓展新思路 数据可视化出图在SEO领域中是非常重要的&#xff0c;它不仅能丰富网站内容&#xff0c;还能提高用户体验。而Python语言在数据处理和可视化方面具有很大的优势&#xff0c;让我们一起来看看如何利用Python出图来拓展SEO应…

使用chartgtp写Android代码

<LinearLayout android:layout_width"match_parent" android:layout_height"match_parent" android:orientation"horizontal"> <TextView android:id"id/姓名" …

第三章 JVM内存概述

附录&#xff1a;精选面试题 Q&#xff1a;为什么虚拟机必须保证一个类的Clinit( )方法在多线程的情况下被同步加锁 &#xff1f; A: 因为虚拟机在加载完一个类之后直接把这个类放到本地内存的方法区&#xff08;也叫原空间&#xff09;中了&#xff0c;当其他程序再来调这个类…

线程池的工作原则揭秘:如何合理管理线程数量?

大家好&#xff0c;我是小米&#xff0c;一个热爱技术分享的小伙伴。在多线程编程中&#xff0c;线程池是一种非常实用的工具&#xff0c;可以帮助我们更好地管理线程&#xff0c;提高程序的性能和稳定性。今天&#xff0c;我将详细介绍线程池的概念、使用方法以及常用参数&…

VUE3中实现游戏摇杆效果

github地址 GitHub - yoannmoinet/nipplejs: A virtual joystick for touch capable interfaces. 演示地址 Nipplejs by yoannmoinet 1.安装nipple npm install nipplejs --save 下面是完整的VUE代码 <el-row> <el-col :span"5"><div id"jo…

15、Redis数据库

1、数据库相关知识简介 1、数据库分类 关系型数据库&#xff1a;Oracle,MySQL,SqlServer,DB2NoSql数据库&#xff1a;NoSQL最常见的解释是“non-relational”&#xff0c; “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念&#xff0c;泛指非关系型的数据库&#xff0c;…

Conditional, Ternary 运算符的使用

1. Conditional 条件运算符的使用 1.1 实现 /// 条件语句 struct ConditionalBootcamp: View {State var showCircle: Bool falseState var showRectangle: Bool falseState var isLoading: Bool falsevar body: some View {//conditionalView1conditionalView2}/// 方式二…

Qt6.5.1+WebRTC学习笔记(八)开发环境搭建(win10+vs2019)

一、准备 1.操作系统win10 64位 2.合理的上网方式&#xff0c;需要正常访问google,最好有20G以上流量 3.安装VS2019&#xff0c;笔者使用的是社区版&#xff0c;并选中C相关&#xff0c;笔者设置如下 注意&#xff0c;win10的sdk需要是10.0.20348.1&#xff0c;其他版本可能…

rt-thread汇总

finish和msh的区别&#xff1f; 这个问题我一直没搞懂&#xff0c;可能得看一下源码才能搞清楚了吧 通过Qemu运行RT-Thread 在windows上通过QEMU快速上手RT-thread smart RT-thread启动流程 rt-thread启动流程 Kconfig语法 Kconfig语法 关于终端的一些问题 终端的管脚配置…

NIO之Selector解读

目录 Selector 简介 为什么会出现Selector Selector 和 Channel 关系 可选择通道(SelectableChannel) Channel 注册到 Selector 选择键(SelectionKey) Selector 的使用方法 Selector 的创建 注册 Channel 到 Selector 轮询查询就绪操作 停止选择的方法 Selector 简…

11. 数据结构之二叉树

前言 上一节&#xff0c;简单概述了树这种数据结构&#xff0c;以及树结构向下&#xff0c;具有某些一些特征的树&#xff0c;比如二叉树&#xff0c;B树&#xff0c;B树&#xff0c;堆等。其中&#xff0c;二叉树是一个很重要的模块。也是在一些技术面试中&#xff0c;可能会…

【LeetCode】268. 丢失的数字

268. 丢失的数字&#xff08;简单&#xff09; 思路 其实这道题和 136.只出现一次的数字类似。我们可以将 nums 的所有数字和 [0, n] 组合&#xff0c;丢失的数字只会在 [0,n] 出现一次&#xff0c;其余数字都会出现两次&#xff0c;我们将它们两两异或&#xff0c;由于相同的…