K60 编码器测角度

这次全国电子设计大赛,我们选做自控题的倒立摆那题。对于角度的测量,考虑K60内部自带正交解码的功能,使用起来方便,所以选取编码器测角度的方案。我观察到成品的倒立摆用的都是2000线以上角度编码器,而我们的编码器只有500线,所以角度测量的准确度上有些许欠缺。

K60 AB正交解码初始化:

PORTB_PCR0= PORT_PCR_MUX(6); // 设置引脚 B0引脚为FTM1_PHA功能
PORTB_PCR1= PORT_PCR_MUX(6); // 设置引脚 B1引脚为FTM1_PHB功能
SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;//使能FTM1时钟
FTM1_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止
FTM1_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同时确定方向和计数值
FTM1_CNTIN=0;//FTM0计数器初始值为0
FTM1_MOD=65535;//结束值

//=========================================================================================================
FTM1_FILTER=FTM_FILTER_CH0FVAL(57);           //滤波计数time=x/11.25M=57/11.25M=5.067us
FTM1_FILTER=FTM_FILTER_CH1FVAL(57);           //滤波计数time=x/11.25M=57/11.25M=5.067us
FTM1_QDCTRL|=FTM_QDCTRL_PHAFLTREN_MASK;
FTM1_QDCTRL|=FTM_QDCTRL_PHBFLTREN_MASK;
//=========================================================================================================
        
FTM1_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//启用FTM2正交解码模式
FTM1_MODE |= FTM_MODE_FTMEN_MASK;//FTM2EN=1	
FTM1_CNT=0;	
        
///
PORTB_PCR18= PORT_PCR_MUX(6); // 设置引脚 B18引脚为FTM2_PHA功能
PORTB_PCR19= PORT_PCR_MUX(6); // 设置引脚 B19引脚为FTM2_PHB功能
SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;//使能FTM2时钟
FTM2_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止
FTM2_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同时确定方向和计数值
FTM2_CNTIN=0;//FTM0计数器初始值为0
FTM2_MOD=65535;//结束值 最大为65535
        
//=========================================================================================================
FTM2_FILTER=FTM_FILTER_CH0FVAL(57);           //滤波计数time=x/11.25M=57/11.25M=5.067us
FTM2_FILTER=FTM_FILTER_CH1FVAL(57);           //滤波计数time=x/11.25M=57/11.25M=5.067us
FTM2_QDCTRL|=FTM_QDCTRL_PHAFLTREN_MASK;
FTM2_QDCTRL|=FTM_QDCTRL_PHBFLTREN_MASK;
//============================================================================================================
        
FTM2_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//启用FTM2正交解码模式
FTM2_MODE |= FTM_MODE_FTMEN_MASK;//FTM2EN=1	
FTM2_CNT=0;	

在周期性定时中断服务程序中,读取FTM1_CNT和FTM2_CNT的值并清0,经过计算即可得到当前的角度,使用int变量保存,如为正数则为正转,负数则为反转。根据实际需要计算角度,例如:

int16_t pluse1=0;
int16_t ang_temp=0;
float angel=0.0;


void PIT0_Isr_GetAngel(void)
{   
    pluse1+=FTM1_CNT;
    ang_temp=pluse1%500;
    angel=(ang_temp/500.0)*360;


    if(pluse1>=500 || pluse1<=-500)
      pluse1=0;
    FTM1_CNT=0;
}
关于kinetis定时器FTM的详细解释可参见: http://blog.csdn.net/cherryfeicherry/article/details/11870533这里写的非常详细透彻。



你可能感兴趣的:(K60 编码器测角度)