|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
17.3 字符类 Buzzer 蜂鸣器* p2 S3 n, d/ l6 x; r, \
和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示。9 ~5 e; o7 Q+ B! X {
![]()
, O, S3 z7 [0 F$ z蜂鸣器的硬件和 led 灯类似,如下图所示。
8 a. d7 q+ v3 d1 j2 P& m ?4 ~& \' Q# v% d 6 r6 y; L+ @/ A ?
如上图所示。5 K. I# J- ~. b( R5 g/ H+ d; y
原理图很容易理解,如果网络 MOTOR_PWM 为高电平,则 L9014 导通,蜂鸣器响,如果网络MOTOR_PWM 为低电平,则 L9014 截止,蜂鸣器则不响。; e- ?0 H7 v' e
操作方式和 led 小灯类似。- \0 E: i0 |/ b/ J- s
蜂鸣器测试例程" _2 y: _5 G; K2 u5 T+ R
编写简单的 buzzertest.c 文件测试蜂鸣器。; z8 e z& Z- W
首先添加头文件,如下图所示,下面新加了几个库文件,一般常用的就是下面几个,写代码的时候,5 o/ {" `4 d n5 |
为了方便,可以直接都添加上。: ]9 W1 D& Z* @/ |$ q9 R2 H0 o
$ H/ P# M3 [. W+ v: X1 c( U$ w
然后 main 函数如下图所示。# M; y5 Z2 S0 b. K+ p2 @4 R' y
# A' U! _/ L4 a# m
如上图代码所示。由于只有一个 IO,底层没有做第三个参数的判断,所以无效& H) l. s! e T5 ?
第 16-19 行,对参数 argv[1]有个简单的判断,命令只能是 0 或者 1。3 I x7 u6 [2 p) B# S
第 21-24 行,open 函数打开蜂鸣器设备节点
/ d! z" }% q: [- G* D* _第 26 行,使用 ioctl 函数操作蜂鸣器。
* X- \/ z$ K$ F1 w% _第 27 行,使用 close 函数关闭设备节点。
! N9 a1 t, C0 D* @/ r编译运行测试5 r3 O# t5 @# n. b
在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystEMCode/charcontrol”,将源码 buzzertest.c 拷贝进去,如下图所示。
) ~% e+ K# L F- R4 }4 I $ M5 M/ \' [; ?+ [/ S
使用命令“ARM-none-linux-gnueabi-gcc -o buzzertest buzzertest.c -static”编译buzzertest 文件,如下图所示,使用命令“ls”可以看到生成了 buzzertest 可执行文件。/ N! `( W+ ?% c, Y
+ \4 r! S. o$ w8 |6 G+ v+ E& y: Q5 Q
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统。7 E. W' ?6 o$ E7 ?) b
将编译成的可执行文件 buzzertest,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘, 运行程序如下。
: P& X7 E3 W; v2 j; d使用参数 1 和 0,蜂鸣器会响。第二个参数实际上并不起作用。; g$ e! o: H' P9 L: B
![]()
" z. J3 g$ ^8 g% x9 y如下图所示,使用参数 0 和 0,蜂鸣器会停止响。
8 w4 P+ G& w5 y1 x![]()
9 ?& o& W$ [' t: z4 R17.4 字符类 ADC 模数转换
# A, }; U( X5 l* @和 led 灯类似,数模转换的设备节点也是在/dev 目录下,如下图所示。7 R, L1 _. E- G K) q0 k% M( [
: j+ u$ ?+ }7 R! c8 S0 X* A3 B; K+ n
模数转换的硬件部分如下图所示。
+ B. V1 C, t c$ y* z$ S / t. @. `$ ?1 k; V5 D- ]7 ?( |
如上图所示。1 O$ G1 ^% y7 |" D9 O" ^9 O
XadcAIN0 网络可以读取到当前输入电压,滑动变阻器 R 移动的时候,1 和 2 之间的电阻 R12 改变,滑动变阻器最大电阻为 R13,然后电压 Vadc=R12*VDD1V8_EXT/R13
" ?5 G" m6 f% Q+ s7 B4 G上面公式中 Vadc 可以通过 4412 读取出来,VDD1V8 和 R13 已知,那么就很容易求出 R12 的电阻。如下图所示,在 4412datasheet 中 ADC 章节中有真实的电阻和电压曲线图。* Y/ @# K- R1 @1 v2 ~+ S4 Z
![]()
* ^" \/ y; s. ]这里将数值做一个简单的换算,
& g5 Q8 g0 [, v3 X7 s1.8V 对应的是 10K 欧姆,对应的寄存器数值为 0xfff;% o2 S& q0 }& v1 }: @# ?
0V 对应的是 0 欧姆,对应的寄存器数值为 0x0。
2 Q- I; u, i6 C这样做一个简单公式,将读取的数值 r 转化为电阻值 R。
8 ^! q6 k9 Z4 r( r6 u2 z' n+ K- SR = r*10000/0xfff,即 R = r*10000/4095。
" G6 r) C' C2 ]这个小公式在后面的代码中将会使用到。
% j/ s" J) O' m) I+ v模数转换例程
7 F3 t% v0 z3 p0 H, o$ ?& {) ~编写简单的 ADC.c 文件测试 adc 的驱动。首先添加头文件,如下图所示。6 O8 a8 Q) R/ w0 x; ^$ Z! }/ V
![]()
) i h J9 P( @ [7 B然后 main 函数如下图所示。' `. r( [0 P! H; y9 b# W& ^+ ^
1 e+ h# J& c& P- ^* s5 ]
如上图代码所示。 X# i! R% v1 L& Z4 [
第 14 行,设备节点为 char *adc = "/dev/adc"。
. G o4 m1 f( T8 V) _) g$ `* B3 V第 21 行,打开设备节点文件。4 V2 y$ W8 D; r6 |8 j* ]
第 26 行,使用 read 函数,将读取数字赋予 buffer。
4 B9 D, n$ K) l$ u' ?第 30 和 31 行,做个简单地换算,将读取的数值转化为电阻值。
- U# _; M6 F" }& I( {编译运行测试0 m- B% O5 {3 I4 ?0 G: F
在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/charcontrol/”将源
+ _% _" w+ |; z) E2 x ]4 f2 Q+ ? ?; m: K码 ADC.c 拷贝进去,如下图所示。
* u! \: q2 p% J8 K" I c8 F![]()
. P% R2 @" u$ y; b: B! E& P使用命令“arm-none-linux-gnueabi-gcc -o ADC ADC.c -static”编译 ADC 文件,如下图所示,使用命令“ls”可以看到生成了 ADC 可执行文件。
& d7 k& |1 ~0 ]& ? R# W3 a ' l0 H, S1 w" c% K
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考 10.3.5 小节。将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序。
1 i4 d9 V; G8 x, w% q7 S如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前电阻值,中间的大段打印参数是多次打印寄存器的数值,在驱动实验中再去介绍。
7 G$ l* }7 r3 i" q1 P![]()
4 e! F& w, i. d. ^5 l# \* r0 Q! K调整滑动电阻器之后,再次使用测试程序,如下图所示,输出数值会有变化。
' }% }: s& u9 p' ~! d3 d; Q . l+ T) w o, J2 Q: D
滑动变阻器向顺时针旋转,阻值会减小,最小为 0;7 h$ y5 c% ^" ]; _ F
滑动变阻器向逆时针旋转,阻值会增大,最大为 10K。4 T/ T( G J7 m, k$ p1 X
![]()
5 [+ r* U: ~7 K# J; j) k5 m
, [4 I+ L9 \' c, |% r) g" Y3 k |
|