MSP430——Timer(输出比较编码器测速)(五)

这篇具有很好参考价值的文章主要介绍了MSP430——Timer(输出比较编码器测速)(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前写过关于定时器输出PWM波的简便方法和利用定时器测量频率,由于之前采用的测周法,这个方法当时测量的频率是非常精准的,但是对于测速度而言,我们采用PID算法的话,就会使得轮子停止响应非常的迅速,在之前算法的基础上,这个当轮子突然停止,也就是说突然一下没有外来脉冲了,会导致频率计算出错,维持一个定值,按理来说应该是零的(如果能够从算法上解决这个问题的话,麻烦大佬们评论区传授一下方法),因此,今天开始尝试利用测频法进行速度测量,相应的使用的就是定时器的输出比较功能,即开一定时间的定时器,再打开IO中断捕捉上升沿或者下降沿,每隔一定时间,获取IO中断捕获的上升沿或者下降沿的脉冲数,从而达到计算速度的目的。

第一步:初始化对应定时器

Timer_A_initContinuousModeParam initContParam = {0};//定义连续模式结构体变量
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;//选择SMCLK
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_16;//不分频
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//暂时不使能中断
    initContParam.timerClear = TIMER_A_DO_CLEAR;//清除定时器
    initContParam.startTimer = false;//暂时不开始计时
    Timer_A_initContinuousMode(TIMER_A0_BASE, &initContParam);

    //Initiaze compare mode
    Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE,//清楚定时器的中断标志位
     TIMER_A_CAPTURECOMPARE_REGISTER_4
    );

    Timer_A_initCompareModeParam initCompParam = {0};
    initCompParam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_4;//选择对应的捕获比较寄存器
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;//使能定时器中断
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;//选择输出模式
    initCompParam.compareValue = COMPARE_VALUE;//确定比较值
    Timer_A_initCompareMode(TIMER_A0_BASE, &initCompParam);//初始化比较模式
    Timer_A_startCounter( TIMER_A0_BASE,//开始计数
    TIMER_A_CONTINUOUS_MODE
    );

    //Enter LPM0
    __bis_SR_register(LPM0_bits);
    //For debugger
    __no_operation();

第二步:中断服务函数

#pragma vector=TIMER0_A1_VECTOR//中断 TIMER1_A0_VECTOR
__interrupt void TIMER0_A1_ISR (void)
{
    unsigned int compval;
    switch(__even_in_range(TA0IV,14))
    {
    case 8:
        compval = Timer_A_getCaptureCompareCount(TIMER_A0_BASE,
            TIMER_A_CAPTURECOMPARE_REGISTER_4)
            + 50000;

    //Toggle P1.0
    GPIO_toggleOutputOnPin(
        GPIO_PORT_P1,
        GPIO_PIN6
        );

    //Add Offset to CCR0
    Timer_A_setCompareValue(TIMER_A0_BASE,
        TIMER_A_CAPTURECOMPARE_REGISTER_4,
        compval
        );
    break;
    }
	_BIC_SR_IRQ(LPM0_bits);
}

根据所选的定时器的频率,确定所需要的定时器时长,即上述代码中的50000.

接下来就是打开IO中断即可

第三步:打开IO中断

void IO_IT_Init(void)//IO中断初始化
{
    GPIO_setAsInputPinWithPullUpResistor(
            GPIO_PORT_P2,
            GPIO_PIN3);
    GPIO_enableInterrupt(
            GPIO_PORT_P2,
            GPIO_PIN3
            );
    GPIO_selectInterruptEdge(
            GPIO_PORT_P2,
            GPIO_PIN3,
            GPIO_HIGH_TO_LOW_TRANSITION
            );
    //P2.3 IFG cleared
        GPIO_clearInterrupt(
            GPIO_PORT_P2,
            GPIO_PIN3
            );
    //Enter LPM4 w/interrupt
        __bis_SR_register(LPM4_bits + GIE);

        //For debugger
        __no_operation();
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=PORT2_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(PORT2_VECTOR)))
#endif
void Port_2 (void)
{
    num++;

    //P2.3 IFG cleared
    GPIO_clearInterrupt(
        GPIO_PORT_P2,
        GPIO_PIN3
        );
}

IO中断需要手动清除中断标志位。

接下来就是计算了,计算的原理很简单。比如定时50ms产生了100个脉冲,即1ms产生2个脉冲,即1s产生2000个脉冲。再根据编码电机的减速比等参数,即可得出1s走的距离,即速度。

本次分享就到这里,希望能够多多交流,有错误麻烦大佬们指正!文章来源地址https://www.toymoban.com/news/detail-614399.html

到了这里,关于MSP430——Timer(输出比较编码器测速)(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32霍尔编码器电机测速原理

            本次选用的编码器电机为13线的霍尔编码器电机,电机减速比为30:1,转动一圈输出13*30=390个脉冲。轮胎直径为75mm,轮胎周长为pi*d=3*75=225mm.定时器采用四倍频计数,则一圈输出390*4=1560个脉冲。具体编码器知识这里就不多说了。          根据测速原理:假设编

    2024年02月15日
    浏览(51)
  • 【程序】【必须】编码器电机测速,原理+代码+滤波

    参考资料: https://blog.csdn.net/lzzzzzzm/article/details/119416134 野火STM32电机开发教程 常见的编码器有两种,分别为霍尔编码器和GMR编码器。 1.1 霍尔编码器 ​ 霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和

    2023年04月23日
    浏览(56)
  • stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速。   编码器被广泛应用于电机测速,实现电机闭环控制 。所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速。         编码电机其实就是一个带有编码器的电机,我的这个电机是一个带霍尔传感器的

    2024年02月13日
    浏览(49)
  • STM32之增量式编码器电机测速

    编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。 . 按监测原理分类 光电编码器 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器

    2024年02月13日
    浏览(39)
  • STM32-微项目07-旋转编码器计数及测速

    一、微项目实现目标: 检测旋转编码器模式下,检测旋转编码器的转动计数值及转速。并且区分转向,一侧转动增加cout,转速值为正,一侧转动减少count,转速值为负;   二、微项目硬件配置需求: 1,stm32F103C8T6核心板一块 2,0.96寸OLED显示,用于显示计数 3,旋转编码器,

    2024年02月08日
    浏览(39)
  • stm32f103单片机—编码器测速

    stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定) 此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8, 定时器使用通道1、2来实现编码器功能 ,接线时注意把A/B相接到定时器通道1/2的引脚。 电

    2024年02月06日
    浏览(76)
  • 【STM32】【HAL库】定时器编码器模式测速

    目录 概述 HAL设置  定时器的编码器模式 定时器设置  常用函数 代码 电机AB相增量型编码器的介绍和解码方法在这里介绍过了 电机编码器 https://blog.csdn.net/m0_57585228/article/details/125791283 测速可以使用外部中断进行脉冲计数 很多型号的单片机中有专门的电路来计算脉冲的速度和

    2023年04月18日
    浏览(58)
  • Stm32-使用TB6612驱动电机及编码器测速

    最近在 学习编码电机以及尝试使用编码电机测速 。遇到了很多问题,花费了很多时间,在这里做一个记录,对自己学习到的知识进行一个总结 找了很多资料,看了很多视频,这些太多了,以至于让我不知道究竟哪一个是正确的,今天看这个,明天看这个,导致自己的学习效

    2023年04月16日
    浏览(70)
  • msp432p401r 编码器电机程序

            编码器电机的原理网上有很多,如果不懂可以看下这个博主的文章STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机_長空雁的博客-CSDN博客         在这里博主只讨论如何去用软件采集测速。 编码器的AB相会输出方波,因为432p系列没有编码器模式

    2024年02月14日
    浏览(52)
  • 【32单片机学习】(3)霍尔编码器减速直流电机控制及测速

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.实验现象 2.实验接线及原理图 接线图 原理图  电机接线图 3.代码部分 1.主函数  main.c 2.按键部分   key.c  key.h pwm代码   pwm.c  pwm.h 电机驱动   motor.c   motor.h  OLED显示 oled.c oled.h  编码器

    2024年02月11日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包