原创 电机转速测量小系统改进

2009-9-12 08:56 3320 6 6 分类: EDA/ IP/ 设计与制造

之前的电机测速小系统只能测量转数,前天花了点时间,做了些改进,把程序改成了真正的测速。


       程序里面使用了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条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条