在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 13202|回复: 34

[讨论] 【原创】基于LM3S811的速度里程计

[复制链接]
发表于 2012-7-8 22:18:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 nwx8899 于 2012-7-8 22:33 编辑

基于LM3S811的速度里程计-----关于定时器、外部中断、SSI模块的综合应用
利用LM3S811的定时器、外部中断、SSI模块等功能制作了一个自行车测速装置。本作品使用LM3S811单片机通过开关型霍尔传感器A04E检测车轮的转数,利用SSI(同步串行通信)模块向两片级联的74HC595发送16位的数据来驱动六位数码管,其中高八位用于片选,低八位用于段选。通过一个按钮来切换显示速度和里程。


1系统方案

1.1 电源由于LM3S811的工作电压是3.3V,所以直接采用两节5号干电池供电。
1.2 显示由于速度与里程的范围:0~40.01和0~700.1,只需5位即可显示。所以用2片3位的数码管吗组成1片6位的,其中第一位分别显示U和L代表速度和里程。
1.2 检测采用外部中断当单片机检测到下降沿时,计数值加一。每隔一秒计算一次速度。

2系统理论分析与计算

2.1 数码管显示
将6个数码管的段选并联,由U1控制;U2的低6位用作片选码。数据帧的大小为16位,其中0~7位为段选码,第8~13用于片选码LM3S811在上电时,所有GPIO引脚默认为输入,软件设计根据应用要求配置GPIO引脚。
在使用SSI时,需通过对RCGC1寄存器中的SSI位置位使能SSI外设时钟。配置SSI为主机模式,协议模式为Freescale SPI单次传输模式。
为了切换显示速度和里程,分别用定时器1和定时器2定时中断,不断刷新数码管。外加一个按钮,当键按下时初始化定时器1,显示里程;否则只初始化定时器2,显示速度。
2.2计算速度与里程

在车轮一周上均匀放置6个磁钢,假设车轮半径0.5m,则车轮转一周为π m。每两个磁钢之间的距离位π/6 m。磁钢检测采用外部中断,每中断一次计数器加

1。再用定时器0定时中断,每隔一秒计算一次速度,v=counter*π/6 m/s转换成V=v*3.6 km/h,里程mile则一直累加。

3电路与程序设计
3.1 数码管显示电路


1.gif

3.2
程序的设计


3.2.1程序流程图




2.gif



3.2.2程序

程序用C语言编写,由主程序、外中断0服务程序,T0中断服务程序、T1中断服务程序等模块组成。主程序主要完成程序初始化和键盘处理,外部中断朋及务程序由测量、计算、读数等部分组成,T0中断服务程序由计时、动态扫描显示、自行车停车判断等部分组成。


4 注意事项4.1 关于中断服务函数所谓的注册中断函数,这里采用直接修改启动代码startup.s的方式。就是找到对应的中断源,然后把默认的中断服务函数名改成自己定义的即可。  

3.gif

5、实物图
4.jpg


附录:源程序#include"hw_memmap.h"
#include"hw_types.h"
#include"ssi.h"
#include"hw_ints.h"
#include"sysctl.h"
#include"gpio.h"
#include"timer.h"
#include"interrupt.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar disp_buf[6];
uchar disp_buf1[6];
uchar disp_tab[13]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f,0x003e,0x0038,0x0080};
ulong TheSysClock=6000000;
float  temp;
ulong  num,counter,speed,mile;
uchar v_qian,v_bai,v_shi,v_ge,l_qian,l_bai,l_shi,l_ge;
ulong ulClock,ulBitRate;
#define  PULSE_PERIPH SYSCTL_PERIPH_GPIOD
#define  PULSE_PORT   GPIO_PORTD_BASE
#define  PULSE_PIN    GPIO_PIN_4
void ssiInit(void)
{  ulBitRate=TheSysClock/10;
   SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);//使能SSI模块
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能SSI所在引脚
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2);//(SSI0CLK_PORT, SSI0CLK_PIN);//将相关GPIO设置为SSI功能
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3);//PA3  SSI0FSS_PORT
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_4);//PA4  SSI0RX_PORT
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5);//PA5  SSI0TX_PORT
   SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, ulBitRate, 16);//SSI配置:基址,协议格式,主/从模式,位速率,数据宽度
   SSIEnable(SSI0_BASE);//  使能SSI收发
}
void timer2AInit()
{   ulClock = TheSysClock/150;// (60 * 8);//扫描速度在60Hz以上时,人眼才不会明显感到闪烁
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);     //使能Timer模块

TimerConfigure(TIMER2_BASE,TIMER_CFG_32_BIT_PER);//配置为32位周期定时器

TimerPrescaleSet(TIMER2_BASE,TIMER_BOTH,100);//配置分频值
    TimerLoadSet(TIMER2_BASE, TIMER_A, ulClock);    //  设置Timer初值

TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT);//  使能Timer超时中断


IntEnable(INT_TIMER2A);                         //  使能Timer中断
    IntMasterEnable();                              //  使能处理器中断
    TimerEnable(TIMER2_BASE,TIMER_A);//使能



int timer.zip (233.96 KB, 下载次数: 4 )
发表于 2012-7-8 23:34:34 | 显示全部楼层
不错,第一个分享,支持
 楼主| 发表于 2012-7-9 21:57:02 | 显示全部楼层
呵呵 必须给力啊
不过排版好像还有问题
发表于 2012-7-9 22:00:51 | 显示全部楼层
回复 3# nwx8899


    还可以了
 楼主| 发表于 2012-7-13 13:52:29 | 显示全部楼层

在论坛模式下是挺好的
发表于 2012-7-18 04:23:08 | 显示全部楼层
回复 1# nwx8899


    nice work~ thanks a lot~
 楼主| 发表于 2012-7-19 00:52:38 | 显示全部楼层
多谢支持
发表于 2012-8-1 11:34:28 | 显示全部楼层
真好!
发表于 2012-8-11 10:19:41 | 显示全部楼层
什么东西来的?
 楼主| 发表于 2012-8-15 18:08:01 | 显示全部楼层
LS兄弟怎么呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 13:49 , Processed in 0.027730 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表