EDA365电子论坛网

标题: 迅为4412开发板Linux字符设备控制(二) [打印本页]

作者: 阳阳天    时间: 2021-3-9 15:21
标题: 迅为4412开发板Linux字符设备控制(二)
17.3  字符类 Buzzer  蜂鸣器
, j) v- U* B; b! V# O6 Z& e和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示。) W! c" |% R6 v% l* c

1 Y1 H# x) d, h9 E蜂鸣器的硬件和 led 灯类似,如下图所示。5 R4 z; v% \) u+ \& H

1 l% N5 B- L9 _* Z) |% ~1 ]$ ?9 T如上图所示。
3 {! z/ _4 J8 `$ y8 m: Z- u8 d* L原理图很容易理解,如果网络 MOTOR_PWM 为高电平,则 L9014 导通,蜂鸣器响,如果网络MOTOR_PWM 为低电平,则 L9014 截止,蜂鸣器则不响。
# `+ m9 I3 P( H& Z) m# g操作方式和 led 小灯类似。# A) j; y7 K5 x( U6 T
蜂鸣器测试例程8 K/ k1 @+ a6 S
编写简单的 buzzertest.c 文件测试蜂鸣器。& u* D5 a& O1 c! L4 e% w* E! s
首先添加头文件,如下图所示,下面新加了几个库文件,一般常用的就是下面几个,写代码的时候,1 S& Z3 g! n, O7 z
为了方便,可以直接都添加上。) `5 `# m$ E. n
" B. R& y, h% V, `
然后 main 函数如下图所示。$ L' @. u6 k4 x; r
- D0 M; i' l& {. G; w
如上图代码所示。由于只有一个 IO,底层没有做第三个参数的判断,所以无效2 N; {! Y2 B; d8 A: G, s
第 16-19 行,对参数 argv[1]有个简单的判断,命令只能是 0 或者 1。* ]( {3 q, A" Y. ^
第 21-24 行,open 函数打开蜂鸣器设备节点) N- a2 P0 `: q  {. f
第 26 行,使用 ioctl 函数操作蜂鸣器。
/ x5 G2 C3 J6 O3 J第 27 行,使用 close 函数关闭设备节点。
" V' Q& f+ \$ C& _2 @* Y编译运行测试# ]/ S7 K+ E/ o0 x* `
Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/charcontrol”,将源码 buzzertest.c 拷贝进去,如下图所示。
/ g' N/ g- G# F. S' A* g3 d- |8 b5 L9 L+ A7 U8 C& H8 s" {$ {- P
使用命令“arm-none-linux-gnueabi-gcc -o buzzertest buzzertest.c -static”编译buzzertest 文件,如下图所示,使用命令“ls”可以看到生成了 buzzertest 可执行文件。: l- E1 d7 ~( m- \

4 ?5 n2 N. B8 Y! P- o( R这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统。; f' C/ p4 b$ W
将编译成的可执行文件 buzzertest,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘, 运行程序如下。
; J# x2 X% f. I8 g2 h使用参数 1 和 0,蜂鸣器会响。第二个参数实际上并不起作用。) \" C1 |* V! [5 @
( B0 K) }$ w' R8 k$ p; C# Q
如下图所示,使用参数 0 和 0,蜂鸣器会停止响。
: l/ |2 s1 z1 n* h$ O3 L* t# Y$ M) y7 `* n' Z6 c+ g$ R, H
17.4  字符类 ADC  模数转换
% t# q0 a6 v2 L- h) x" {和 led 灯类似,数模转换的设备节点也是在/dev 目录下,如下图所示。1 Q* B5 P6 c* t7 T! _# A
; }2 I+ Z% R# s5 U2 x* y5 H
模数转换的硬件部分如下图所示。
& Q* s( ?9 n5 ]1 U9 ~6 Q: a. o. S4 ~6 [2 @; _6 @2 K# O
如上图所示。
6 K: c1 t+ {. q5 v6 Z7 g3 P6 nXadcAIN0 网络可以读取到当前输入电压,滑动变阻器 R 移动的时候,1 和 2 之间的电阻 R12 改变,滑动变阻器最大电阻为 R13,然后电压 Vadc=R12*VDD1V8_EXT/R13: k5 w5 B% ^8 Z& _, ^, z9 h1 M
上面公式中 Vadc 可以通过 4412 读取出来,VDD1V8 和 R13 已知,那么就很容易求出 R12 的电阻。如下图所示,在 4412datasheet 中 ADC 章节中有真实的电阻和电压曲线图。6 P( u- b) m! n- @' }8 s1 E$ e7 y
8 Y8 B/ O3 s% e! ]: H1 J% ]( i. \
这里将数值做一个简单的换算,
* t0 x" a2 b! f& p, S1.8V 对应的是 10K 欧姆,对应的寄存器数值为 0xfff;
4 ~" _6 r. V3 q; Z" x/ P0V 对应的是 0 欧姆,对应的寄存器数值为 0x0。# M: T& t$ r! L# d
这样做一个简单公式,将读取的数值 r 转化为电阻值 R。3 L0 ~0 [% v. b& n, h$ |3 X. q
R = r*10000/0xfff,即 R = r*10000/4095。- x: V7 Z2 c2 u, g, e- u
这个小公式在后面的代码中将会使用到。
/ ~4 r2 I+ @( X, k) O" @% n模数转换例程
7 N' Q1 T% e) C* k' ^编写简单的 ADC.c 文件测试 adc 的驱动。首先添加头文件,如下图所示。
$ b6 r: d- L' T
! I9 b5 {0 G! c: b然后 main 函数如下图所示。
9 p  y2 \- i' A) g) g: k1 [* ]" d; F
$ v. R8 u; c5 h4 d如上图代码所示。
7 Q2 T+ z2 `5 e6 Q* u第 14 行,设备节点为 char *adc = "/dev/adc"。
. c& N6 d% k# v5 |) S8 a第 21 行,打开设备节点文件。$ A* B2 M& \" U, U: X+ Y- c
第 26 行,使用 read 函数,将读取数字赋予 buffer。
: x3 _- o  H) z' Q$ _0 Y2 m第 30 和 31 行,做个简单地换算,将读取的数值转化为电阻值。
4 F0 m3 [" }# D- W  T8 a编译运行测试/ A+ i+ x, Q6 p8 \
在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/charcontrol/”将源
" ?" X) i' J+ O码 ADC.c 拷贝进去,如下图所示。
' L, ]3 |) |1 ]' u5 E3 d& d+ \4 A4 \/ c1 U5 ^! `+ w
使用命令“arm-none-linux-gnueabi-gcc -o ADC ADC.c -static”编译 ADC 文件,如下图所示,使用命令“ls”可以看到生成了 ADC 可执行文件。# e1 g" I  {7 o- [' D9 [' A# H: Y4 o

! Q5 A  G" R  l/ T+ `这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考 10.3.5 小节。将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序。2 m, x$ _& Z; [; S" Z+ T! X
如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前电阻值,中间的大段打印参数是多次打印寄存器的数值,在驱动实验中再去介绍。
1 r9 m# b8 I  r7 P0 \  ]7 U
2 A7 @% h& l4 _调整滑动电阻器之后,再次使用测试程序,如下图所示,输出数值会有变化。9 X. M. q+ h7 y: S

* D2 N1 c5 c* H7 R  u# u滑动变阻器向顺时针旋转,阻值会减小,最小为 0;* j  I/ c2 v# K) R. V/ L" S
滑动变阻器向逆时针旋转,阻值会增大,最大为 10K。+ f. o& g( U! I! W/ u5 b

7 f4 s2 \3 m! L8 m' f1 Z, A& n  q& n, ^/ D
2 @. L$ l3 g1 d0 j) T% a
作者: ByElmer1    时间: 2021-3-10 10:18
                                            




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2