毕业设计之wifi视频监控小车(四)

    很幸运,写这第四篇的时我实物功能等基本已经完全实现了,剩下的就是优化代码关于服务器部分的了,第四章将介绍如何控制小车吧,主要是pwm驱动部分。先说下我硬件部分有:板子、USB转串口线(ps一定要买贵的,撇的有乱码),电源适配器、USB摄像头,USBwifi-TLWN321G+模块,四个直流电机,小车底板,L298N一块,11.1V电池组(供L298N用),4hubUSB分线器(因为板子只有一个USB接口要扩展),板供独立电源5v一块(供板子不用适配器),还有路由器等。

    看芯片手册和板子资料可以看出有两个引脚GPB0,1是可以支持TOUT输出的,刚好通过一个L298N可以控制两个电机,然后通过差速可以转弯,硬件条件具备,所以剩下就是配置pwm和找4个引脚来输出高低电平就可以了,我这里找的是GPF0,1,2,3通过查芯片手册得到了以下需要用的重要信息:

这种方法其实很好的,一目了然,可以根据我需要的然后进行配置。引脚信息查完了接下来就是如何通过定时器配置pwm了。

嗯,还是看芯片手册,虽然都是英文的,但是我们知道pwm原理就只需要看寄存器的地址个需要使用的位了,这是我总结的信息:

然后就是总结了我们需要哪些东西,首先是两个TCGF0和TCFG1,设置两次分频,否管它原理是什么,我们只需要能用就行,因为我使用的是定时器0和1,所以只需要TCFG0和TCFG1的8位就可以了也就是7:0,这是第一点我们需要对这连个寄存器的低八位设定值。

    然后是控制寄存器TCON,我们需要的是11:0,也就是12位,3:0 这4位用来设置timer0,死区使能先不管,保留的不管,11:8这四位用来设置timer1,具体工作原理,首先我们需要手动加载下面会说到的两个寄存器的值,然后再设置自动重载,和start timer就可以了,如何设置代码再分析。

    然后两个timer0 的寄存器TCNTB0和TCMPB0,TCNTO暂时用不着,TCNTB和TCMPB就是拿来设置频率的了,根据我一开始的分频再根据这样的寄存器的值就可以确定具体的输出频率,具体应该怎样算自行百度。我们只需要知道给这两个寄存器设定值,值是有范围的哈,稍微百度一下pwm的知识就知道的,大佬略过,然后同理有timer1的TCNTB1和TCMPB1需要我们设置。

    首先不管原理和默认寄存器TCNT那些的话我们需要操作的只有7个寄存器,嗯,如果你只用一个定时器的话还只有5个。然后就是我个人写的控制小车的pwm驱动了,之因为写成驱动的方式,当然是为了方便啊,应用层给几个ioctl就好了,还有就是一个简单的字符驱动,写起来也不需要多高深的,大佬们都直接略过的,好了看代码:

首先也是基于一种基类的字符驱动,然互构建一个自己要使用的对象,关于驱动如何写,框架是什么那些我不多赘述,高深的我也讲不清楚,大家还是参考其他大佬的博客,好,从图片看到我们把操作的寄存器都用指针定义了,gpb只选择功能,gpf选择功能然后对gpfdat相应位写0,1来表示高低电平。然后两个套路函数,因为不要数据的读写传输啥的,所以什么等待队列那些都没有,就简单的字符控制,嗯:


然后应该是ioctl的,这个放到后面去

然后一个套路结构体:

然后是重点,加载这个驱动时要做的是的函数:

挨着来,一开始申请注册设备号,当然我这是手动的,然后映射寄存器地址,然后根据先前整理的原理文档,设置gpf引脚功能,gpb的后面再说,然后设置tcgf0,1两个值,看注释,然后看注释,配置的比较小,不需要小车跑太快。然后:

设置定时器0,1的自动重载,完全按照位来的,通俗易懂,看注释,然后就是卸载驱动要干嘛的套路函数:

就取消映射,没啥毛病,然后是关于ioctl的了:

start:有注释,设置gpb引脚和开始timer0,1,至于为什么在这里设置gpb,因为板子蜂鸣器接的gpb0,如果放在初始化函数里,那么驱动加载后蜂鸣器就会响,所以放着里面了,刚好控制小车就响相当于一种标志,然后run前进。写gpfdat - 0101,然后stop重要是写gpf - 0000 应为差速转弯所以频率也重置下,然后是左右,用的差速:

然后GO ON是直走的意思,straight太长不好写,所以简写了,重新置为相同的速度。最后quit,取消gpb,停止定时器,和gpfdat 0000,到这里c文件基本就完成了,然后h文件就那几个命令,

随便写。


最后再说编译,写一个Makefile文件如下:

在内核源码的driver 目录下新建一个文件夹,把这三个文件放进去,然后看Makefile前两个注释,最后倒数那个文件名字改成自己c文件的.o然后通过make modules 和make modules_install将会在根文件夹目录下产生.ko文件,要加载这个模块需要首先

在dev下创建一个设备:mknod /dev/car c 300 0

然后在模块的目录下使用insmod xxx.ko 加载,然后这是一个测试程序:

当然也需要那个.h文件这样手动的加载驱动和设备基本就没问题了。

    接下的问题就是,这样的话我们每次都需要是有insmod或者modprobe等去手动加载模块,我们可以把它编进内核,这样内核启动时可以自动加载,当然我们的设备是手动分配的所以mknod那一步省不了,关于如何让内核自动分配,大家自行找其他资料,下面讲怎么编译进内核,因为是普通的字符设备,所以我们需要现将那两个c和h文件拷贝到源码的drivers/char/目录下;

然后就在这个目录下进行 vim Kconfig 找到类似有config    XXX的地方,按部就班我们加入,还是给图吧:

这是文件和目录

找到 menu“character devices”

加两行就行,然后保存退出。

然后不要换目录,直接vim Makefile

这样加上就可以,然后保存退出,返回到源码目录,使用make menuconfig

 在character devices下找到我们的配置,选上:

然后出去重新编译下载内核就可以了,这样我的简单的小车驱动基本就完成了,然后就是接线部分了,这里说一下

我用的驱动直流电机模块是L298N 关于那个5v输出的我没有管,然后是电源买的11.1V的航模组电池接上,在和开发板共地就可以了,其他关于L298N的知识就不多介绍了,好,第四篇完,下一篇讲wifi的使用。

猜你喜欢

转载自blog.csdn.net/devilbuqi/article/details/79803863