对于TI板他定时器没有STM芯片对应的:编码器接口模式,他不能自动的通过定时器进行对应捕获上升下降,从而计数器计数。
电机测量脉冲数的话使用:外部中断进行捕获(下面有源码,对应库函数进行配置)
上几篇讲述了定时器的中断,了解了他的相关知识,对应他的中断就是溢出中断,或者判断IO口是否有上升下降触发中断;
这个是定时器溢出中断:
MSP430F5529(定时器中断溢出,带你深刻认识CCR0通道独有中断和共享中断溢出中断)进行区分定时器计数模式,目标值设置值;_postgraduate1887的博客-CSDN博客
这个是使用定时器的捕获模式进行测量脉冲,只是简单的把他当作一个外部中断使用了,不会的建议学一下;
这个是CCR独有中断捕获;
MSP430F5529自主开发笔记1:编码器测速_定时器中断捕获法测速\测正反转_postgraduate1887的博客-CSDN博客
这个是定时器共享中断捕获;
MSP430F5529自主开发笔记2:编码器测速_定时器中断捕获法测速\测正反转(使用共享中断)续编2_postgraduate1887的博客-CSDN博客
废话不多说,直接外部中断。
#include "driverlib.h"
#include "msp430.h"
#include "oled.h"
#include "type.h"
#include "EXIT_CAPTURE.h"
#include "TIMER_MOTOR_CLEAR.h"
#include "MOTOR_PWM.h"
#include "TIME_CLOCK.h"
static long Encoder_L = 0;
static long Encoder_R = 0;
static int speed_L = 0;
static int speed_R = 0;
void main (void)
{
WDT_A_hold(WDT_A_BASE);
CLOCK_Change();
OLED_Init();
OLED_Clear();
//EXIT_CAPTURE;
EXIT_init();
//TIMER_CLEAR;
TIMER_CLEAR_Init();
//MOTOR_PWM
PWM_TO_MOTOR();
PWM_PIN();
__bis_SR_register(GIE);
OLED_ShowString(1,1,"Encode_L:",10);
OLED_ShowString(1,3,"Encode_R:",10);
while(1){
OLED_ShowNum(70,1,speed_L,4,30);
OLED_ShowNum(70,3,speed_R,4,30);
}
}
//外部中断捕获编码器
#pragma vector=PORT2_VECTOR
__interrupt void PORT2(void)
{
//都使用上升沿判断,双倍频;A相B相都进行判断脉冲;
//P2.6A相
if(GPIO_getInterruptStatus(GPIO_PORT_P2,GPIO_PIN6) == GPIO_PIN6 )
{
if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN0))
{
Encoder_R--;
}
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN0))
{
Encoder_R++;
}
GPIO_clearInterrupt(GPIO_PORT_P2,GPIO_PIN6);
}
//P2.0B相
if(GPIO_getInterruptStatus(GPIO_PORT_P2,GPIO_PIN0) == GPIO_PIN0 )
{
if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
{
Encoder_R++;
}
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN6))
{
Encoder_R--;
}
GPIO_clearInterrupt(GPIO_PORT_P2,GPIO_PIN0);
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1(void)
{
//都使用上升沿判断,双倍频;A相B相都进行判断脉冲;
//PA相
if(GPIO_getInterruptStatus(GPIO_PORT_P1,GPIO_PIN5) == GPIO_PIN5 )
{
if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4))
{
Encoder_L--;
}
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4))
{
Encoder_L++;
}
GPIO_clearInterrupt(GPIO_PORT_P1,GPIO_PIN5);
}
//PB相
if(GPIO_getInterruptStatus(GPIO_PORT_P1,GPIO_PIN4) == GPIO_PIN4)
{
if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN5))
{
Encoder_L++;
}
if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN5))
{
Encoder_L--;
}
GPIO_clearInterrupt(GPIO_PORT_P1,GPIO_PIN4);
}
}
//设置闸门时间进行适当时间清除
//增计数模式,打开CCR0中断通道,关闭TAIE定时器中断;
//建议10ms
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR (void)
{
speed_L=Encoder_L;
speed_R=Encoder_R;
Encoder_L = 0;
Encoder_R = 0;
}
注意:中断IO口不可以使用复用模式,PxSEL这个寄存器。复用打开,中断失能;
MSP里面外部中断对应的中断是统一的,对应哪个IO口发生中断要进行if判断,这个采用了二倍频的方式进行捕获脉冲数;
定时器中断选择CCR0独有中断进行10ms一次的脉冲清零,定时器中断起到的是闸门时间的作用,后续进行速度计算要在中断里面对应计算;
有什么不懂的地方随时可以评论找我;