日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

基于友善之臂ARM-ContexA9-ADC驱动开发

發布時間:2025/3/17 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于友善之臂ARM-ContexA9-ADC驱动开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ADC,就是模數轉換器,什么是模數轉換器?

模數轉換器,在電子技術中即是將模擬信號轉換成數字信號,也稱為數字量化。

當然還有一種叫DAC,就是數模轉換,意思相反,即是將數字信號轉換成模擬信號。

在友善之臂ARM-contexA9這款開發板上的4412芯片本身就自帶了一個ADC的接口,我們來看看基本介紹:


數據手冊開篇介紹了這么多,最有用的一句話:精度10位或12位CMOS模數轉換器(ADC)包括多路模擬輸入。靈敏度為1M,一共有4路輸入,支持較低的電源模式等。

接下來我們還是跟以前一樣:

1、先看電路原理圖:


從原理圖和核心板上可以看出可調電阻的IO對應數據手冊的是AIN[0]。



2、看數字手冊相關的寄存器

(1)ADC控制寄存器


寄存器的地址為:0x126C0000

在這里,我們要如何配置呢?

[0] 第0位:判斷A/D轉換有沒有開始

[2] 第2位:配置模式位(正常的,標準的,我們這里選擇默認為0)

[6:13]第6~13位:這里要配置預分頻系數,我們配置為49,對應的公式就是:ADCCLK=PCLK/(49+10)=100MHZ / 50 =2MHZ

[14]第14位:選擇使能預分頻,寫1到這個位去就可以了

[15]第15位:判斷A/D轉換結束了沒有

[16]第16位:設置轉換的精度(10或者12,自己選)

(2)ADC數據寄存器



基地址:0x126C000C

[11:0] 第0~11位:ADC轉換的數據

(2)ADC通道選擇寄存器


基地址:0x12C001C

ADCMUX[0:3]:這里我們配置為0000,也就是通道0

3、寫代碼

config.h

<span style="font-size:18px;">#ifndef __CONFIG_H__ #define __CONFIG_H__#define udelay ((void (*)(unsigned int ))0x43e25e88) //定義udelay在uboot中的地址,這樣我們就可以使用這個函數 #define print ((int (*)(const char *, ...))0x43e11434) //定義printf在uboot中的地址typedef unsigned int u32; typedef volatile u32 v32; //設置位 #define set_one(reg, bit) \((*(v32 *)reg) |= (1<<bit)) #define set_zero(reg, bit) \((*(v32 *)reg) &= (~(1<<bit))) #define set_bit(reg, bit, val) \(*(v32 *)reg = (((*(v32 *)reg) & (~(1<<bit))) | (val << bit))) #define set_2bit(reg, bit, val) \(*(v32 *)reg = (((*(v32 *)reg) & (~(3<<bit))) | (val << bit))) #define set_nbit(reg, bit, n, val) \(*(v32 *)reg = (((*(v32 *)reg) & (~( ((1<<n)-1) <<bit))) \| (val << bit))) #define set_val(reg, val) \((*(v32 *)reg) = val)#define get_bit(reg, bit) \(((*(v32 *)reg) & (1<<bit)) >> bit) #define get_2bit(reg, bit) \(((*(v32 *)reg) & (3<<bit)) >> bit) #define get_nbit(reg, bit, n) \(((*(v32 *)reg) & (((1<<n)-1) <<bit)) >> bit) #define get_val(reg) \(*(v32 *)reg)#endif</span> adc.h

<span style="font-size:18px;">#ifndef __ADC_H__ #define __ADC_H__#define ADCCON 0x126C0000 //ADC控制寄存器 #define ADCDAT 0x126C000C //ADC數據寄存器 #define ADCMUX 0x126C001C //ADC通道寄存器 #define CLRINTADC 0x126C0018 //清除ADC中斷#endif</span>

adc.c

<span style="font-size:18px;">#include <adc.h> #include <config.h>void select_mux(void) {set_nbit(ADCMUX, 0, 4, 0x0); //設置通道為通道0 }void adc_init(void) {set_val(ADCCON, ((1<<16)|(1<<14)|(49<<6))); //按照數據手冊參數來配置adc控制寄存器的初始化部分 }void adc_start(void) {set_one(ADCCON, 0); //adc轉換開始的配置,默認參數為0 }int adc_wait_flag(void) {return get_bit(ADCCON, 15);<span style="white-space:pre"> </span>//AD轉換是否成功 }int adc_data(void) {return get_nbit(ADCDAT, 0, 12); //獲取ADC數據 } void clear_adc(void) {set_val(CLRINTADC, 0);<span style="white-space:pre"> </span>//清ADC }</span>

main.c

<span style="font-size:18px;">#include <config.h> #include <adc.h> int main(void) { //設置ADC通道為通道0select_mux();//adc初始化adc_init();//adc轉換開始adc_start();while(1){//判斷是否已經轉換if(adc_wait_flag()){//打印相應的數據print("data = %d\n",adc_data());//重新adc轉換開始adc_start();}} return 0; }</span>
4、makefile略

5、觀察結果

先讓uboot啟動


然后用dnw下載程序:


最后旋轉電阻觀察數據變化:





總結

以上是生活随笔為你收集整理的基于友善之臂ARM-ContexA9-ADC驱动开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。