之前的电机测速小系统只能测量转数,前天花了点时间,做了些改进,把程序改成了真正的测速。
程序里面使用了2个定时器,定时器0和间歇定时器(我喜欢叫做软定时器),定时器0是捕捉编码盘产生的脉冲,每20个脉冲为1转,记录电机转数。软定时器产生1秒钟中断,当有1秒钟后就检测此时的电机转数,转换成转速,并将转数清零,重新计数。
在相册里面附上测量结果。我的小电机转速高达14000多转每分钟。3V小电机,5V供电。
/****************************************************************************
程序名称:测量电机转速
程序编写:唐爱明
编写日期:20090517
使用模块:单点
使用协议:802.15.4
程序备注:直流电机+20孔编码盘
通过串口调试助手显示:115200-8-N-1
****************************************************************************/
/****************************************************************************
* NAME: 头文件
****************************************************************************/
#include<jendefs.h>//变量类型定义
#include<AppHardwareApi.h>//硬件
#include<AppQueueApi.h>//堆栈
#include"..\..\Chip\Common\Include\Printf.h"//串口
/****************************************************************************
* NAME: 全局变量
****************************************************************************/
PRIVATE uint32 number = 0;//转数
uint8 Flag = 1;//1秒钟定时标志
/****************************************************************************
* NAME: 函数声明
****************************************************************************/
PRIVATE void vTimerConfig(void);//定时器设置
PRIVATE void vTimer0ISR(uint32 u32DeviceId,uint32 u32ItemBitmap);//定时器0执行函数
PRIVATE void vTickTimerISR(uint32 u32DeviceId,uint32 u32ItemBitmap);//TickTimer定时中断函数
/****************************************************************************
* NAME: 冷启动
* DESCRIPTION:
****************************************************************************/
PUBLIC void AppColdStart(void)
{
(void)u32AppApiInit(NULL,NULL,NULL,NULL,NULL,NULL);//初始化应用API
(void)u32AHI_Init();//初始化协议栈
vUART_printInit();//串口初始化
vTimerConfig();//定时计数器设置
while(1)
{}
}
/****************************************************************************
* NAME: 热启动
* DESCRIPTION:
****************************************************************************/
PUBLIC void AppWarmStart(void)
{
AppColdStart();// 能启动
}
/****************************************************************************
* NAME: 定时器设置
* DESCRIPTION:
****************************************************************************/
PRIVATE void vTimerConfig(void)
{
vAHI_TimerEnable(E_AHI_TIMER_0,//定时器0
0x00,//时钟预分频值
FALSE,//不使能中断当输出上升沿时
TRUE,//使能中断当定时周期完成并输出下降沿时
FALSE);//不使能PWM输出引脚输出
vAHI_TimerClockSelect(E_AHI_TIMER_0,//定时器0
TRUE,//使用外部时钟
FALSE);//门输入低电平时打开输出引脚
vAHI_TimerStartSingleShot(E_AHI_TIMER_0,//定时器0
0x0000,// 开启定时器到输出上升沿的时钟周期数
0x0014);//开启定时器到输出下降沿的时钟周期数,首次记录脉冲个数
vAHI_Timer0RegisterCallback(vTimer0ISR);//指向定时中断函数
vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_DISABLE);//不使能TickTimer
vAHI_TickTimerInit(vTickTimerISR);//TickTimer中断函数
vAHI_TickTimerWrite(0);//重启定时器
vAHI_TickTimerInterval(16000000); // 定时1s
vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_RESTART);//定时发生后重启
vAHI_TickTimerIntEnable(TRUE);//使能定时中断
}
/****************************************************************************
* NAME: 定时中断函数vTimer0ISR
* DESCRIPTION:
****************************************************************************/
PRIVATE void vTimer0ISR(uint32 u32DeviceId,uint32 u32ItemBitmap)
{
number++;//转数自增
vAHI_TimerStartSingleShot(E_AHI_TIMER_0,//定时器0
0x0000,//空值
0x0014);//20个脉冲中断1次,即1转
if(Flag == 0)//定时1秒钟中断发生
{
vPrintf("电机转速 = %d转/秒 \n\r",number);//显示转数
Flag = 1;//标志置1
number = 0;//转数清0
}
else {}//定时1秒钟中断没发生,什么都不执行
}
/****************************************************************************
* NAME: 定时中断函数vTickTimerISR
* DESCRIPTION:
****************************************************************************/
PRIVATE void vTickTimerISR(uint32 u32DeviceId,uint32 u32ItemBitmap)
{
Flag = 0;//1秒钟定时中断发生就让标志置0
}
/****************************************************************************/
/*** 文件结束 ***/
/****************************************************************************/
文章评论(0条评论)
登录后参与讨论