{$cluname}

意得法论坛 » EDA综合论坛 » 电机转速测量小系统改进


‹‹上一主题 | 下一主题›› 查看 1220
发表一个新帖子 发表回复

标题 电机转速测量小系统改进 在百度搜索本主题 [ 搜 ] [ 打印 ] [ 推荐 ] [收藏帖子] [ 收藏到新浪VIVI] [ 订阅 ]

janeye (附小一年级)
楼主   [点击复制本网址] [ 字体: ] [ 编辑 ] [ 报告 ] [评分]
Rank:1
Rank:1
UID 96
帖子 11
积分 31 点
金币 54 枚
魅力 22 度
注册 2009年12月9日
电机转速测量小系统改进

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

       程序里面使用了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
}

/****************************************************************************/
/***       文件结束                                                 ***/
/****************************************************************************/





此用户离线!
共计在线时长140分钟2009-12-09 10:50:53
[ 资料 ] [ 短信 ] [ 好友 ] [ 文集 ] [ 引用 ] [ 回复 ] 点击返回顶部

男人海洋 (附小一年级)
第2楼 [ 字体: ] [ 编辑 ] [ 报告 ] [评分]
Rank:1
Rank:1
UID 112
帖子 9
积分 19 点
金币 38 枚
魅力 15 度
注册 2009年12月14日
回复:电机转速测量小系统改进

表情图标EM1




此用户离线!
共计在线时长30分钟2009-12-14 8:50:48
[ 资料 ] [ 短信 ] [ 好友 ] [ 文集 ] [ 引用 ] [ 回复 ] 点击返回顶部

« 首页1 »1/共1页


查看积分策略说明快速回复你的内容
快捷回复标题 (选填) 快捷插入表情图标
验 证 码  点击获取验证码
快捷回复内容

自动复制

Powered by TEAM 2.0.5 Release - ACC © 2005 Team5 Studio All rights reserved