S5PV210裸机(九):ADC

news2024/9/25 13:15:26

        本文主要探讨210的ADC相关知识。   

        ADC
         
       ADC:模数转换(模拟信号转数字信号)
                量程:模拟电压信号范围(210为0~3.3V)
                精度:若10二进制位来表示精度(210为10位或12位),量程为0~3.3V,则精度为3.3V/2^10=0.0032265V
                转换速率(MSPS):每秒转多少M数字值,210为 1 MSPS
                通道数:模拟信号输入的路数,210共10ADC通道(AIN[0]~AIN[9]),同时可做10路AD转换,通道引脚为模拟引脚

        ADC寄存器


                

                TSADCCON0 ADC的配置


                TSDATX0,TSDATY0转出的AD值


 

                CLRINTADC0清中断


                ADCMUX选择AD通道

demo:

        测试ADC的值变化状况(转动螺丝)

start.S

#define WTCON           0xE2700000
#define SVC_STACK       0xd0037d80
#define SOFT_SW         0xE010E81C
 
.global _start
 
_start:
 
        //set soft switcher,mean set XEINT[0] as PS_HOLD_OUT_EN,set output high level
        ldr r0, =SOFT_SW
        ldr r1, [r0]
        orr r1, r1, #0x300
        orr r1, r1, #0x01
        str r1, [r0]
 
        //close WatchDog
        ldr r0,=WTCON
        ldr r1,=0x0
        str r1,[r0]
 
        //init SVC stack
        ldr sp,=SVC_STACK
 
 
        //init icache
        mrc p15,0,r0,c1,c0,0
        bic r0,r0,#(1<<12)      //close icache
        orr r0,r0,#(1<<12)      //open icache
        mcr p15,0,r0,c1,c0,0 
 
 
        //use func
        bl main
 
        b .

main.c 

#include "uart_printf.h"
#include "adc.h"
#include "stdio.h"

int main()
{
        //init uart
        init_uart();
        printf("init uart\r\n");

        //init adc
        printf("init adc\r\n");
        init_adc();

        //read adc
        printf("read adc data\r\n");
        read_adc_data();

        return 0;
}

uart_printf.h

void init_uart();

uart_printf.c

#define GPA0CON         0xE0200000
 
#define ULCON0          0xE2900000
#define UCON0           0xE2900004
#define UFCON0          0xE2900008
#define UMCON0          0xE290000C
#define UTRSTAT0        0xE2900010
#define UTXH0           0xE2900020
#define URXH0           0xE2900024
#define UBRDIV0         0xE2900028
#define UDIVSLOT0       0xE290002C
 
#define rGPA0CON        (*(volatile unsigned int *)GPA0CON)
#define rULCON0         (*(volatile unsigned int *)ULCON0)
#define rUCON0          (*(volatile unsigned int *)UCON0)
#define rUFCON0         (*(volatile unsigned int *)UFCON0)
#define rUMCON0         (*(volatile unsigned int *)UMCON0)
#define rUTRSTAT0       (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0          (*(volatile unsigned int *)UTXH0)
#define rURXH0          (*(volatile unsigned int *)URXH0)
#define rUBRDIV0        (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0      (*(volatile unsigned int *)UDIVSLOT0)
 
//init uart
void init_uart()
{
        //set gpio as uart(rx,tx)
        rGPA0CON &= ~(0xff);
        rGPA0CON |= ((1<<2)|(1<<5));
 
        //set uart base configure(mode)
        rULCON0 = 0x3;
        rUCON0 = 0x5;
        rUMCON0 = 0;
        rUFCON0 = 0;
 
        //set uart baud
        //DIV_VAL = (PCLK / (bps x 16))-1
        //(66000000 /(115200 * 16)) -1 = 34.8
        rUBRDIV0 = 34;
 
        //set uart baud calibration
        //0.8 * 16 = 13,check 210 table
        rUDIVSLOT0 = 0xdfdd;
}
 
 
//send data
void putc(char data)
{                  
        while (!(rUTRSTAT0 & (1<<1)));
        rUTXH0 = data;
}
 
//receive data
char getc()
{
        while (!(rUTRSTAT0 & (1<<0)));
        return (rURXH0 & 0xff);
}

adc.h

void init_adc();

void read_adc_data();

adc.c

#include "stdio.h"

#define TSADCCON0       0xE1700000
#define TSDATX0         0xE170000C
#define TSDATY0         0xE1700010
#define ADCMUX          0xE170001C

#define rTSADCCON0      (*(volatile unsigned int *)TSADCCON0)
#define rTSDATX0        (*(volatile unsigned int *)TSDATX0)
#define rTSDATY0        (*(volatile unsigned int *)TSDATY0)
#define rADCMUX         (*(volatile unsigned int *)ADCMUX)

static void dealy_time()
{
        volatile unsigned int num = 900000;
        while(num--);
}

void init_adc()
{
        //set adc is 10 bit 
        rTSADCCON0 |= (1<<16); 
        //set adc enable prescaler 
        rTSADCCON0 |= (1<<14);
        //set adc prescaler value,value = 66 / (65 + 1) = 1Mhz
        rTSADCCON0 &= ~(0xff<<6);
        rTSADCCON0 |= (65<<6); 
        //set adc mode(normal)
        rTSADCCON0 &= ~(1<<2);
        //close when start adc is read only
        rTSADCCON0 &= ~(1<<1);
        //select adc channel 0
        rADCMUX &= ~(0xf);
}

void read_adc_data()
{
        volatile unsigned int x_value = 0;
        volatile unsigned int y_value = 0;
        while(1)
        {
                //start adc
                rTSADCCON0 |= (1<<0);
                //judge adc adc covert status(end or ing)
                while(!(rTSADCCON0 & (1<<15)));
                //read adc data
                x_value = rTSDATX0;
                y_value = rTSDATY0;
                printf("read adc data :   x : %d    y : %d\r\n",(x_value & 0xfff),(y_value & 0xfff));
                dealy_time();
        }
}

link.lds

SECTIONS
{
        . = 0xd0020010;
 
        .text : 
        {
                start.o
                * (.text)
        }
    
        .data : 
        {
                * (.data)
        }
 
        bss_start = .;
 
        .bss : 
        {
                * (.bss)
        }
}

Makefile

 

CC      =       arm-linux-gcc
LD      =       arm-linux-ld
OBJCOPY =       arm-linux-objcopy
OBJDUMP =       arm-linux-objdump
 
INCDIR  := $(shell pwd)
 
#预处理器的flag,flag就是编译器可选的选项
CPPFLAGS  := -nostdlib -nostdinc -I$(INCDIR)/include
#C编译器的flag
CFLAGS    := -Wall -O2 -fno-builtin
 
export CC LD OBJCOPY OBJDUMP CPPFLAGS CFLAGS
 
objs      := start.o uart_printf.o main.o adc.o
objs      += lib/libc.a
 
led.bin:$(objs)
        $(LD) -Tlink.lds -o adc.elf $^
        $(OBJCOPY) -O binary adc.elf adc.bin
        $(OBJDUMP) -D adc.elf > adc.dis
        gcc mkv210.c -o mkv210
        ./mkv210 adc.bin sd.bin
 
lib/libc.a:
        cd lib;  make;  cd ..
 
%.o:%.S
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
 
%.o:%.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
 
clean:
        rm *.o *.elf *.bin *.dis mkv210 -f
        cd lib; make clean; cd ..

文件示例:

结果示例:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Umijs项目优化

首先通过npm run analyze 查看打包后的文件进行观察&#xff0c;哪些包的体积大&#xff0c;然后分解开 体积较大的文件:echarts、wangeditor、antd、moment.js package.json 文件配置 .umirc.ts配置文件 1. 分包配置 通过 webpack-chain 的 API 修改 webpack 配置。 chunk…

水果音乐编辑软件 flstudio_mac_21.2.0.3405中文破解版

flstudio_mac_21.2.0.3405中文破解版是Mac系统中的一款水果音乐编辑软件&#xff0c;提供多种插件&#xff0c;包括采样器、合成器和效果器&#xff0c;可编辑不同风格的音乐作品&#xff0c;Pattern/Song双模式&#xff0c;可兼容第三方插件和音效包&#xff0c;为您的创意插上…

.jnlp打开方式

首先配置电脑的java环境。 百度搜索jre下载&#xff0c;会有很多结果&#xff0c;一般选择官网进行下载。 下载正确的jre版本。 我的电脑是windows 64位&#xff0c;根据你自己电脑的情况选择版本进行下载。不懂自己电脑是多少位的可以看下一步。 查看电脑是64位还是32…

halcon roberts、 prewitt_amp、 sobel_amp、 edges_image、 laplace_of_gauss 对比

原图 灰度&#xff1a; roberts 算子&#xff1a; prewitt算子 sobel 算子 canny算子 拉普拉斯 代码&#xff1a; read_image (Image, C:/Users/alber/Desktop/opencv_images/canny.png) rgb1_to_gray (Image, GrayImage)* 测试 roberts 算子 roberts (GrayImage, ImageRoberts…

使用自动编码器进行半监督异常检测

使用自动编码器进行半监督异常检测 前言前提条件相关介绍Semi-supervised Anomaly Detection using AutoEncoders项目结构训练模型测试模型 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入YOLO系列专栏、自…

【NI-DAQmx入门】数字IO基础知识

1.漏端和源端数字IO的区别 漏端和源端是用于定义负载中直流电流控制的术语&#xff0c;分别表示所用到的数字输入和输出的类型。 漏端的数字I / O&#xff08;输入/输出&#xff09;提供与负载的接地连接。源端的数字I / O为负载提供电压源。 以一个由数字输入与数字输出相连…

javaEE -12(12000字CSS入门级教程)

css即层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS基本语法规范&#xff1a; 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决定修改啥. (干啥)声明的属性是…

Linux-mipi接口

mipi_csi接口 mipi_dsi接口

Qwt QwtPlotBarChart自定义条形统计图

1.概述 QwtPlotBarChart 是 Qt 绘图库 Qwt 中的一个类&#xff0c;用于绘制柱状图。它可以将数据通过柱形的高度来展示&#xff0c;方便比较不同数据量的大小差别。QwtPlotBarChart 类提供了一些方法和属性来设置柱形的样式、颜色、边界等。 以下是类的继承关系图&#xff1a…

oracle (8)Managing Tablespace Data File

Managing Tablespace & Data File &#xff08;维护表空间和数据文件&#xff09; 目标&#xff1a; 定义表空间和数据文件的用途创建表空间管理表空间学会使用甲骨文托管文件(OMF) 创建和管理表空间&#xff08;不是重点&#xff09;获取表空间信息 一、基础知识 1、表…

【0基础学Java第四课】-- 逻辑控制

4. 逻辑控制 4.1 顺序结构4.2 分支结构4.2.1 if语句判断一个数字是奇数还是偶数判断一个数字是正数&#xff0c;负数&#xff0c;还是零判断一个年份是否为闰年 4.2.2 switch 语句 4.3 while循环打印 1 - 10 的数字计算 1 - 100 的和计算 5 的阶乘计算1&#xff01;2&#xff0…

FHE 的高精度算术:BGV-big、BFV-big

参考文献&#xff1a; [NL11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[GC15] Geihs M, Cabarcas D. Efficient integer encoding…

TypeScript:简介(附思维导图)

TypeScript&#xff1a;简介 Date: May 23, 2023 思维导图&#xff1a; TypeScript简介 注&#xff1a;已用XMind总结 什么是 TypeScript Typed JavaScript at Any Scale. 添加了类型系统的 JavaScript&#xff0c;适用于任何规模的项目。 以上描述是官网[1]对于 TypeScript…

【软考】14.3 设计模式

《设计模式》 有下划线&#xff1a;类模式 / 对象模式无下划线&#xff1a;对象模式 创建型 设计模式 创建对象 构建器&#xff08;Builder&#xff09;&#xff1a;类和构造分离抽象工厂&#xff08;Abstract Factory&#xff09;&#xff1a;抽象接口工厂&#xff08;Factor…

Kubernetes Service 详解

Author&#xff1a;rab 目录 前言一、ClusterIP1.1 简介1.2 案例 二、NodePort2.1 简介2.2 案例 三、LoadBalancer3.1 简介3.1.1 MetalLB 简介3.1.2 MetalLB 部署3.1.3 MetalLB 配置3.1.3.1 Layer 2 模式3.1.3.2 BGP 模式 3.2 案例3.2.1 部署3.2.2 验证 四、ExternalName4.1 简…

大数据技能大赛平台搭建(容器环境)

大数据技能大赛平台搭建&#xff08;容器环境&#xff09; 一、Hadoop3.X 完成分布式安装部署1、 JDK安装1、解压jdk2、修改配置文件3、免密登录 2、hadoop集群环境搭建1、配置文件2、配置环境变量3、给slave1和slave2分发配置文件4、启动Hadoop集群 3、配置完成&#xff01; 二…

奇富科技引领大数据调度革命:高效、稳定、实时诊断

日前&#xff0c;在世界最大的开源基金会 Apache旗下最为活跃的项目之一DolphinScheduler组织的分享活动上&#xff0c;奇富科技的数据平台专家刘坤元应邀为国内外技术工作者献上一场题为《Apache DolphinScheduler在奇富科技的优化实践》的精彩分享&#xff0c;为大数据任务调…

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。

在阅读本文前&#xff0c;可以先阅读我的上一篇文章&#xff1a; SpringBoot&#xff0c;使用JavaMailSender发送邮件(含源码)。 &#xff0c;本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中&#xff0c;…

智安网络|保护您的应用程序免受攻击:重要的安全强化措施

在今天的数字化时代&#xff0c;应用程序安全成为了企业和个人必须重视的重要领域。应用程序普遍存在的安全漏洞成为黑客们进行攻击的一个突破口。为了保护敏感数据和个人隐私&#xff0c;我们必须了解并实施一系列的关键措施来加固应用程序的安全性。 首先&#xff0c;一个关…

3D max软件有哪些技巧可快速选择区域?

使用3D max软件时&#xff0c;有新手朋友反馈说&#xff0c;为什么3dmax选择区域怎么改不了&#xff1f; 还有就是3dmax选择区域不显示该怎么办&#xff1f; 或者是3dmax选择区域变成圆形了。 针对以上这几类问题&#xff0c;只要掌握这几种方法就可以。小编整理了几种3D max…