数模转换(ADC)、IIC、2440内部IIC寄存器、主机发送、主机接收

我要成为嵌入式高手之4月15日ARM第八天!!
————————————————————————————

ADC

概念

ADC是模拟到数字转换器的缩写。是一种电子设备或者模块。用于将连续变化的模拟信号转换为离散的数字信号,以便数字系统能够对其进行处理和分析。

模拟量和数字量的特点

模拟信号一般是指连续变化的电压信号,其数值在一定范围内变化。而数字信号是由一系列离散的数字表示,只能取有限的值,通常以二进制的形式表示。

ADC的分辨率

逐次逼近法比较的次数决定了测量的精度,这个精度称为ADC的分辨率

ADC的转换原理

ADC的工作原理是将模拟信号分割成一系列离散的取样,并将每个取样值转换为相应的数字表示

涉及到两个步骤:

        1、采样:ADC将连续变化的模拟信号在一定时间间隔进行取样。取样频率决定了每秒采集到的样本数,通常以Hz表示;采样过程 通过保持并测量模拟信号在每个采样时间点的电压值来实现。

        2、量化:采样得到的连续模拟信号经过量化转换为数字形式。量化是将每个采样值映射到一个离散的数字值的过程。通常通过比较采样值与参考电压之间的差异,并将其转换为数字表示。

模/数转换器及触摸屏接口

10 位 CMOS ADC(模/数转换器)是一个 8 通道模拟输入的再循环类型设备。

特性

– 分辨率:10 位

– 差分线性误差:± 1.0 LSB

– 积分线性误差:± 2.0 LSB

– 最大转换率:500 KSPS

– 功耗低

– 供电电压:3.3V

– 模拟输入范围:0 至 3.3V

– 片上采样-保持功能

– 普通转换模式

– 分离的 X/Y 方向转换模式

– 自动(顺序)X/Y 方向转换模式

– 等待中断模式

A/D 转换时间

当 PCLK 频率在 50MHz 并且预分频器的值为 49 时,共 10 位的转换时间如下:

A/D 转换器频率 = 50MHz / (49+1) = 1MHz

转换时间 = 1/(1MHz / 5 周期) = 1/200KHz = 5µs

ADC 和触摸屏接口特殊寄存器

ADC 控制寄存器(ADCCON)

ADC 转换数据寄存器(ADCDAT0)

用串口调试

void adc_init(void)
{
	ADCCON |= (1 << 14);
	ADCCON &= ~(0xFF << 6);
	ADCCON |= (49 << 6);
	ADCCON &= ~(7 << 3);
	ADCCON &= ~(1 << 2);
	ADCCON &= ~(1 << 1);	
}

unsigned short do_adc(void)
{
	ADCCON |= (1 << 0);
	
	while ((ADCCON & (1 << 15)) == 0);
	
	//结束的结果放在ADCDAT0寄存器
	return ADCDAT0 & 0x3FF;	
}
#include "clock.h"
#include "led.h"
#include "adc.h"
#include "uart.h"
#include <stdio.h>
#include <string.h>

int main(void)
{
	unsigned short ret;	
	char s[32];

	clock_init();
	adc_init();
	uart0_init();	

	while (1)
	{
		ret = do_adc();
		sprintf(s, "%u", ret);
		uart0_send_buffer((unsigned char *)s, strlen(s));
		delay(0x3FFFF);
	}
}

ADC 控制寄存器(ADCCON)的读启动A/D转换:只要读走数据,下次就立马启动转换

解决误差

1、硬件加入滤波

2、软件采集时连续采集多个点,然后均值滤波、最小二乘法等算法进行求值

IIC(I2C)

概念:

        中文叫集成电路总线。是一种同步串行半双工通信总线方式。所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。这两个信号都是双向的。

时序逻辑:

        1、IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要 外接上拉电阻。

        2、每次通信前,发送方先发送一个“起始信号”(SCL为高电平时,SDA发送一个低电平);当其他设备接收到这个起始信号后,将进行一次“总线仲裁”(除了发送起始信号以外的其他设备都处于聆听状态)

        3、数据传输时,时钟线 SCL 上的信号为高电平期间,数据线 SDA 上的数据必须保持稳定;时钟线SCL为低电平时,数据线SDA上的电平才允许变化;SCL信号由发送端提供。输出到数据线SDA上的每个字节必须是八位;数据传输时先传输最高位MSB,后传输最低位LSB。

        4、发送端每发送一个字节,就在时钟脉冲9期间释放数据线SDA,由接收器反馈应答信号:主机SCL拉高,读取从机SDA的电平。有效应答位ACK:接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。
        SDA低电平:规定为有效应答位(ACK),表示接收器成功接收该字节。
        SDA为高电平:规定为非应答位(NACK),表示接受器没有成功接收该字节。

        5、发送方发送完最后一个bit后,需要发送一个结束标志位:SCL为高电平时,数据线SDA由低向高跳变。

一个板子最多装载8块AT24C08(A0,A1,A2组合)

时序图

1、字节写

START:2440

2、页写

3、当前地址读

5、随机读

6、连续读

2440内部IIC寄存器

        S3C2440A RISC(经典指令集) 微处理器可以支持一个多主控 IIC 总线串行接口。一条专用串行数据线(SDA)和一条专用 串行时钟线(SCL)传递连接到 IIC 总线的总线主控和外设之间的信息。SDA 和 SCL 线都为双向的。

S3C2440A 的 IIC 总线接口有 4 种工作模式:

1、主机发送模式  2、主机接收模式 3、从机发送模式 4、从机接收模式

1、主机发送模式 

端口 E 控制寄存器(GPECON,GPEDAT,GPEUP)

多主机 IIC 总线控制(IICCON)寄存器

IIC总线应答使能置1:当2440往24c02写数据时,24c02发送应答信号时,2440会产生中断

发送时钟值不:能超过400k

中断模式(INTMOD)寄存器

中断屏蔽(INTMSK)寄存器

中断偏移(INTOFFSET)寄存器

初始化函数:

void iic_init(void)
{
	GPECON |= (2 << 28) | ((unsigned int)2 << 30);
	IICCON |= (1 << 7) | (1 << 6) | (1 << 5);
	IICCON &= ~(0x0F << 0);	
	
	INTMOD &= ~(1 << 27);
	INTMSK &= ~(1 << 27); 		
}

unsigned int iic_isr;

void iic_handle(void)
{
	iic_isr = 1;	
}

void do_wait_ack(void)
{
	iic_isr = 0;
	IICCON &= ~(1 << 4);
	while (iic_isr == 0)
	{
		delay(0x4000);
	}
}

1、主机发送函数

void write_24c02(unsigned char address, unsigned char *pdata, unsigned int len)
{
	IICSTAT = 0xF0;
	
	IICDS = 0xA0;//24c02地址
	do_wait_ack();
	
	IICDS = address;//24C02内部数据将要存储的地址
	do_wait_ack();

	while (len != 0)
	{
		IICDS = *pdata++;
		do_wait_ack();
		--len;		
	}

	IICSTAT = 0x0D;
	IICCON &= ~(1 << 4);
	delay(0x4000);
}

2、主机接收模式

主机接收函数:

void read_24c02(unsigned char address, unsigned char *pdata, unsigned int len)
{
	unsigned int i;
	
	IICCON |= (1 << 7);
	IICSTAT = 0xF0;
	IICDS = 0xA0;//24c02地址
	do_wait_ack();
	
	IICDS = address;
	do_wait_ack();

	IICSTAT = 0xB0;
	IICDS = 0xA0;
	do_wait_ack();

	*pdata = IICDS;
	do_wait_ack();

	for (i = 0; i < len; ++i)
	{
		if (i == len - 1)
		{
			IICCON &= ~(1 << 7);
			*pdata++ = IICDS;
			IICCON &= ~(1 << 4);
			delay(0x4000);
		}
		else
		{
			*pdata++ = IICDS;
			do_wait_ack();
		}
	}
	IICSTAT = 0x90;
	IICCON &= ~(1 << 4);
	delay(0x4000);		
}

main.c

int main(void)
{
	char s[128] = {0};

	wdt_init();
	clock_init();
	uart0_init();
	eint_init();
	iic_init();
		
	pos = 0;

	write_24c02(0, "hello world", strlen("hello world"));
	read_24c02(0, (unsigned char *)s, 15);		
	//uart0_send_buffer((unsigned char *)s, 15);
	while (1)
	{
   		if (pos != 0)
		{
			delay(0x3FFFF);
			write_24c02(0, rcvBuffer, pos);
			delay(0x3FFF);
			read_24c02(0, (unsigned char *)s, pos);
			uart0_send_buffer((unsigned char *)s, pos);
			pos = 0;			
		}
	}	
}

此外还应该打开中断和串口进行调试

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

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

相关文章

Open3D 体素滤波(30)

Open3D 体素滤波(30) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 体素滤波(Voxel Grid Filtering)是一种常用的点云滤波算法,用于对点云数据进行下采样(降低数据密度)以及去除噪声。该算法将点云数据划分为规则的体素网格,然后在每个体素中选择一个代表性点作为…

动态规划算法求解最长公共子序列

动态规划算法是运筹学中求解多阶段决策问题的经典算法&#xff0c;本文将介绍动态规划算法的基本思想&#xff0c;并介绍如何使用动态规划算法求解最长公共子序列问题。 1. 动态规划算法的基本思想 动态规划算法本质也是基于分治思想&#xff0c;将待求解问题分解成若干个子问…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…

c++-----继承

01&#xff1a;继承是什么 定义 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象 程序设计…

【C语言】带你完全理解指针(六)指针笔试题

目录 1. 2. 3. 4. 5. 6. 7. 8. 1. int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】 2&#xff0c;5 【解析】 定义了一个指向整数的指针ptr&#xff0c;并将其初始化为&…

FactoryMethod工厂方法模式详解

目录 模式定义实现方式简单工厂工厂方法主要优点 应用场景源码中的应用 模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 实现方式 简单工厂 以下示例非设计模式&#xff0c;仅为编码的一种规…

在centos8.5上迁移深度学习环境的时候碰到的一下问题(需要运维人员解决的)

我负责的是将开发服务器上的深度学习环境进行打包并将该环境迁移到生产服务器上&#xff0c;这些操作可以在其他博客中搜到 本文主要介绍我把环境包上传至生产服务器中的anaconda/envs/路径下&#xff0c;解压之后&#xff0c;运行测试代码时遇到的问题 IT部门是如何处理的&am…

mfc 带有复选框的ListBox

mfc 带有复选框的 ListBox 效果&#xff1a; 添加 ListBox 控件 从工具箱拖拽 ListBox 控件到窗口上&#xff0c;并设置属性&#xff1a; 包含字符串&#xff1a;true所有者描述&#xff1a;Fixed 给ListBox添加控制变量 添加完后&#xff0c;将m_list_box的类型使用CC…

Rustdesk如何编译代码实现安装后,不会在右下角出现托盘图标

环境&#xff1a; Rustdesk1.1.9 问题描述&#xff1a; Rustdesk如何编译代码实现安装后&#xff0c;不会在右下角出现托盘图标 解决方案&#xff1a; 安装后只有自定义进程图标 详细方案&#xff0c;有需要私聊

L2-1 堆宝塔分数

本题链接&#xff1a;PTA | 程序设计类实验辅助教学平台 题目&#xff1a; 样例&#xff1a; 输入 11 10 8 9 5 12 11 4 3 1 9 15 输出 4 5 思路&#xff1a; 这是一道模拟题&#xff0c;需要有耐心读题&#xff0c;跟着题目走一遍&#xff0c;就可以了。 代码详解如下&…

中霖教育:没有计量相关工作经验可以考注册计量师吗?

不可以&#xff0c;报考注册计量师需要满足相关工作年限要求&#xff0c;如果没有相关工作经验是不能报考的。 具体要求如下&#xff1a; 一级计量师; 1.取得理学类或工学类专业大学专科学历&#xff0c;工作满6年&#xff0c;其中从事计量技术工作满4年; 2.取得理学类或工…

每日OJ题_完全背包②_力扣322. 零钱兑换

目录 力扣322. 零钱兑换 问题解析 解析代码 优化代码&#xff08;滚动数组&#xff09; 力扣322. 零钱兑换 322. 零钱兑换 难度 中等 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中&#xff0c;外观模式是一种常用的结构型设计模式&#xff0c;旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口&#xff0c;这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

链表拓展之双向链表

前言 在前面已经总结了单链表&#xff0c;有了单链表的基础会很好理解双链表的实现&#xff0c;忘记了可以跳转——>http://t.csdnimg.cn/GFPk9 接下来就由我带着各位看官来认识今天的主角吧~ 什么是双向链表 在单链表的基础上&#xff0c;它有两个方向的链接&#xff0c;一…

加强fou循环的坑

今天遇到了一个有趣的事情&#xff0c;使用加强fou循环操作list时&#xff0c;会报错并发操作异常。 直到看了编译类&#xff0c;才发现&#xff0c;加强fou循环其实就是通过迭代器操作&#xff1a; 这里就会出现一个问题&#xff0c;迭代器在取出值时&#xff0c;就回去检测这…

分析ARP解析过程

一、实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连&#xff0c;如图7.17所示&#xff0c;路由器充当网关。 图7.17 二、需求描述 查看 ARP 相关信息,熟悉在PC 和 Cisco 设备上的常用命令,设置主机A和主机B为同一个网段网关设置为路由接口地址。 三、推…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…

2.2 @SpringBootApplication

2.2 SpringBootApplication 在前文的介绍中&#xff0c;读者已经了解到SpringBootApplication注解是加在项目的启动类上的。 SpringBootApplication实际上是一个组合注解&#xff0c;定义如下&#xff1a; SpringBootConfiguration EnableAutoConfiguration ComponentScan(exc…