|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
17.3 字符类 Buzzer 蜂鸣器( z- }# \% K" h0 P1 I' N+ \
和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示。* j7 D$ C7 _" n8 a' U
/ N# x' D5 M* ~) ]* `5 s
蜂鸣器的硬件和 led 灯类似,如下图所示。
& W6 r4 h8 p0 ~![]()
" Z' i# a, W, h如上图所示。$ j8 a+ h# o0 b+ Z# k
原理图很容易理解,如果网络 MOTOR_PWM 为高电平,则 L9014 导通,蜂鸣器响,如果网络MOTOR_PWM 为低电平,则 L9014 截止,蜂鸣器则不响。: _+ ~1 s9 ~4 U4 W9 [; U6 P
操作方式和 led 小灯类似。
5 u% U! `4 N# W$ x X, C9 a$ n g蜂鸣器测试例程
' j m& s r3 E( a7 ?" v# k8 e编写简单的 buzzertest.c 文件测试蜂鸣器。! a5 K" }: o: q* c2 {
首先添加头文件,如下图所示,下面新加了几个库文件,一般常用的就是下面几个,写代码的时候,, p7 b) u1 T4 s3 Y6 K9 [
为了方便,可以直接都添加上。
- ?' D0 _9 @( i# q4 R$ ]" _8 S G$ R6 F: M5 R) I6 v
然后 main 函数如下图所示。
' U+ w6 |6 b Q& |- u / c; h. X& \# G
如上图代码所示。由于只有一个 IO,底层没有做第三个参数的判断,所以无效
) A4 Y2 ]5 l/ C% C" u第 16-19 行,对参数 argv[1]有个简单的判断,命令只能是 0 或者 1。
3 n2 e* }3 l* p' t# r第 21-24 行,open 函数打开蜂鸣器设备节点2 \; i* c4 o3 Y
第 26 行,使用 ioctl 函数操作蜂鸣器。- g/ \1 g3 E8 d# p
第 27 行,使用 close 函数关闭设备节点。1 d6 v; A" W5 X/ O6 f' ^
编译运行测试 c6 z- Z' \/ u
在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystEMCode/charcontrol”,将源码 buzzertest.c 拷贝进去,如下图所示。
8 Y# v6 L6 m6 C+ } 0 g! [# z% h: c7 f" Q$ f
使用命令“ARM-none-linux-gnueabi-gcc -o buzzertest buzzertest.c -static”编译buzzertest 文件,如下图所示,使用命令“ls”可以看到生成了 buzzertest 可执行文件。: n! a3 W6 z5 o' T3 _4 g8 Y! b% z
. U3 N# A( `( R" W
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统。
( ~7 m0 l& |! y将编译成的可执行文件 buzzertest,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘, 运行程序如下。
1 B1 R/ L" a- X使用参数 1 和 0,蜂鸣器会响。第二个参数实际上并不起作用。5 I h- H9 y# R! X. n
![]()
. W" k6 l" J" p+ l+ a/ h5 I1 w如下图所示,使用参数 0 和 0,蜂鸣器会停止响。9 k; w; [5 B+ s& ]1 h
![]()
6 ]1 j S$ o( G17.4 字符类 ADC 模数转换/ m5 L7 V* c/ _
和 led 灯类似,数模转换的设备节点也是在/dev 目录下,如下图所示。
$ m. O5 s7 b& U4 r& L+ N & W7 X2 \5 I# k) B: [
模数转换的硬件部分如下图所示。0 }; K' A# F4 c9 u1 \
+ N' z, g( ]( z
如上图所示。5 L, O8 W9 l$ E8 F" o' b- _7 [
XadcAIN0 网络可以读取到当前输入电压,滑动变阻器 R 移动的时候,1 和 2 之间的电阻 R12 改变,滑动变阻器最大电阻为 R13,然后电压 Vadc=R12*VDD1V8_EXT/R13$ _& S2 ?" E( O, Z0 z: C' W- G
上面公式中 Vadc 可以通过 4412 读取出来,VDD1V8 和 R13 已知,那么就很容易求出 R12 的电阻。如下图所示,在 4412datasheet 中 ADC 章节中有真实的电阻和电压曲线图。6 Q1 }& c) p" M* L
![]()
# w* b$ G- c& Z2 W. @这里将数值做一个简单的换算,2 |; b* b- W+ P7 r
1.8V 对应的是 10K 欧姆,对应的寄存器数值为 0xfff;# L9 ~' I* ^ p
0V 对应的是 0 欧姆,对应的寄存器数值为 0x0。7 j6 K; n! k3 h4 W% \
这样做一个简单公式,将读取的数值 r 转化为电阻值 R。
( f4 G; ]8 d0 Q s4 \6 fR = r*10000/0xfff,即 R = r*10000/4095。2 w$ d" ~% l3 J: H! p1 G* i
这个小公式在后面的代码中将会使用到。+ t; o& _' R( [/ h. \: e' R) A
模数转换例程8 k' g1 o7 u0 l# D% x( _
编写简单的 ADC.c 文件测试 adc 的驱动。首先添加头文件,如下图所示。
( s4 _9 \% a6 Z+ |& F3 P![]()
! z4 _) O8 @# i6 _) F+ L3 b- W! I K+ F然后 main 函数如下图所示。4 V |. _$ A( n2 ^) w
; b; [4 F1 a [5 F/ w
如上图代码所示。- w' E/ H1 B: z7 m' u: d) r
第 14 行,设备节点为 char *adc = "/dev/adc"。
; E6 k" e$ J) w4 p第 21 行,打开设备节点文件。: }# D D8 w9 C% V
第 26 行,使用 read 函数,将读取数字赋予 buffer。6 U% V9 T5 b6 \/ ?' e0 o; B$ p
第 30 和 31 行,做个简单地换算,将读取的数值转化为电阻值。3 v6 [0 L, I4 c4 w4 A
编译运行测试
, ~, |) s# r1 K# k' c1 d4 R) ~5 F在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/charcontrol/”将源
6 x; g/ a$ O4 D+ k码 ADC.c 拷贝进去,如下图所示。
* U9 u; Z9 D. x5 A4 X![]()
( ^; j2 Y; F4 _7 ?& G$ q5 C3 N使用命令“arm-none-linux-gnueabi-gcc -o ADC ADC.c -static”编译 ADC 文件,如下图所示,使用命令“ls”可以看到生成了 ADC 可执行文件。
7 Z* B/ Z( L6 {, d 1 H2 |1 f5 `# o1 q7 h9 |& Q. W
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考 10.3.5 小节。将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序。
9 } ^8 c5 V+ V4 m如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前电阻值,中间的大段打印参数是多次打印寄存器的数值,在驱动实验中再去介绍。$ s$ ~/ Q/ ?- F1 O& Y0 w; \9 U3 W/ M
# T7 T- O0 h- k/ {, _
调整滑动电阻器之后,再次使用测试程序,如下图所示,输出数值会有变化。( q3 A* Z& c4 Z& C$ O5 S
! \* l! z* p2 E% i. d8 b
滑动变阻器向顺时针旋转,阻值会减小,最小为 0;
1 V: P; @' B2 @3 B5 ?滑动变阻器向逆时针旋转,阻值会增大,最大为 10K。$ `4 g% k4 G j: u9 V/ u( F+ S5 _
9 C N. s8 S% C* ^
. s7 }7 K4 ?% J1 {: Y0 [( p
|
|