void Qd::setMode () { //===Setings pin===// //pha pha.settingPinPort(QdDef::PhaPort); pha.settingPin(QdDef::PhaPin, QdDef::PhaAlt); //phb phb.settingPinPort(QdDef::PhbPort); phb.settingPin(QdDef::PhbPin, QdDef::PhbAlt); //===Settings timer===// FTM_SC_REG(ftm_ptr[num_ftm]) = 0; setPeriod(FTM_MOD_MOD_MASK); setInitValue(0); FTM_MODE_REG (ftm_ptr[num_ftm]) |= FTM_MODE_WPDIS_MASK; FTM_MODE_REG (ftm_ptr[num_ftm]) |= FTM_MODE_FTMEN_MASK; FTM_CnSC_REG(ftm_ptr[num_ftm], 0) = 0; FTM_CnSC_REG(ftm_ptr[num_ftm], 1) = 0; FTM_QDCTRL_REG(ftm_ptr[num_ftm]) |= FTM_QDCTRL_QUADEN_MASK|FTM_QDCTRL_PHAFLTREN_MASK|FTM_QDCTRL_PHBFLTREN_MASK; FTM_FILTER_REG (ftm_ptr[num_ftm]) |= FTM_FILTER_CH0FVAL(2) | FTM_FILTER_CH1FVAL(2) ; start (); }
/** * @brief 编码器初始化函数 * * @param port 端口号,由宏定义声明 * * @return ER 错误码 * * @note 系统时钟频率最好是大于输入信号频率,可同过分频系数DIVIDE对系统进行1~128分频(寄存器FTMx_SC的后三位) */ ER ftm_decoder_init(PORT port) { switch (port) { case PTA8_9: SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK; /* 使能FTM时钟 */ /* 选择引脚复用功能 */ PORTA_PCR8 = PORT_PCR_MUX(6); PORTA_PCR9 = PORT_PCR_MUX(6); /* 配置成正交编码功能 */ FTM_CNTIN_REG(FTM1_BASE_PTR) = 0x0000; /* 初始值 */ FTM_MOD_REG(FTM1_BASE_PTR) = 0xffff; /* 可根据需要设定 */ FTM_FMS_REG(FTM1_BASE_PTR) = 0x00; /* write protect disable */ FTM_MODE_REG(FTM1_BASE_PTR) = 0x05; /* 不使能write protect 功能,缺省值;FTMEN=1; */ /* 0001,1000 CLKS=11:extern Clock;PS=000|DIVIDE:system clock divided by 1or2or4or8or16or32or64or128; */ FTM_SC_REG(FTM1_BASE_PTR) = 0x18 | FTM_DEC_DEV1; /* 0000,1101 不是能过滤,QUADMODE=1:count and direction mode;QUADIR=1:increasing;QUADEN=1 */ FTM_QDCTRL_REG(FTM1_BASE_PTR) = 0x0d; break; case PTA10_11: SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK; /* 使能FTM时钟 */ /* 选择引脚复用功能 */ PORTA_PCR10 = PORT_PCR_MUX(6); PORTA_PCR11 = PORT_PCR_MUX(6); /* 配置成正交编码功能 */ FTM_CNTIN_REG(FTM2_BASE_PTR) = 0x0000; /* 初始值 */ FTM_MOD_REG(FTM2_BASE_PTR) = 0xffff; /* 可根据需要设定 */ FTM_FMS_REG(FTM2_BASE_PTR) = 0x00; /* write protect disable */ FTM_MODE_REG(FTM2_BASE_PTR) = 0x05; /* 不使能write protect 功能,缺省值;FTMEN=1; */ /* 0001,1000 CLKS=11:extern Clock;PS=000|DIVIDE:system clock divided by 1or2or4or8or16or32or64or128; */ FTM_SC_REG(FTM2_BASE_PTR) = 0x18 | FTM_DEC_DEV1; /* 0000,1101 不是能过滤,QUADMODE=1:count and direction mode;QUADIR=1:increasing;QUADEN=1 */ FTM_QDCTRL_REG(FTM2_BASE_PTR) = 0x0d; break; case PTA12_13: SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK; /* 使能FTM时钟 */ /* 选择引脚复用功能 */ PORTA_PCR12 = PORT_PCR_MUX(7); PORTA_PCR13 = PORT_PCR_MUX(7); /* 配置成正交编码功能 */ FTM_CNTIN_REG(FTM1_BASE_PTR) = 0x0000; /* 初始值 */ FTM_MOD_REG(FTM1_BASE_PTR) = 0xffff; /* 可根据需要设定 */ FTM_FMS_REG(FTM1_BASE_PTR) = 0x00; /* write protect disable */ FTM_MODE_REG(FTM1_BASE_PTR) = 0x05; /* 不使能write protect 功能,缺省值;FTMEN=1; */ /* 0001,1000 CLKS=11:extern Clock;PS=000|DIVIDE:system clock divided by 1or2or4or8or16or32or64or128; */ FTM_SC_REG(FTM1_BASE_PTR) = 0x18 | FTM_DEC_DEV1; /* 0000,1101 不是能过滤,QUADMODE=1:count and direction mode;QUADIR=1:increasing;QUADEN=1 */ FTM_QDCTRL_REG(FTM1_BASE_PTR) = 0x0d; break; case PTB0_1: SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK; /* 使能FTM时钟 */ /* 选择引脚复用功能 */ PORTB_PCR0 = PORT_PCR_MUX(6); PORTB_PCR1 = PORT_PCR_MUX(6); /* 配置成正交编码功能 */ FTM_CNTIN_REG(FTM1_BASE_PTR) = 0x0000; /* 初始值 */ FTM_MOD_REG(FTM1_BASE_PTR) = 0xffff; /* 可根据需要设定 */ FTM_FMS_REG(FTM1_BASE_PTR) = 0x00; /* write protect disable */ FTM_MODE_REG(FTM1_BASE_PTR) = 0x05; /* 不使能write protect 功能,缺省值;FTMEN=1; */ /* 0001,1000 CLKS=11:extern Clock;PS=000|DIVIDE:system clock divided by 1or2or4or8or16or32or64or128; */ FTM_SC_REG(FTM1_BASE_PTR) = 0x18 | FTM_DEC_DEV1; /* 0000,1101 不是能过滤,QUADMODE=1:count and direction mode;QUADIR=1:increasing;QUADEN=1 */ FTM_QDCTRL_REG(FTM1_BASE_PTR) = 0x0d; break; case PTB18_19: SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK; /* 使能FTM时钟 */ /* 选择引脚复用功能 */ PORTB_PCR18 = PORT_PCR_MUX(6); PORTB_PCR19 = PORT_PCR_MUX(6); /* 配置成正交编码功能 */ FTM_CNTIN_REG(FTM2_BASE_PTR) = 0x0000; /* 初始值 */ FTM_MOD_REG(FTM2_BASE_PTR) = 0xffff; /* 可根据需要设定 */ FTM_FMS_REG(FTM2_BASE_PTR) = 0x00; /* write protect disable */ FTM_MODE_REG(FTM2_BASE_PTR) = 0x05; /* 不使能write protect 功能,缺省值;FTMEN=1; */ /* 0001,1000 CLKS=11:extern Clock;PS=000|DIVIDE:system clock divided by 1or2or4or8or16or32or64or128; */ FTM_SC_REG(FTM2_BASE_PTR) = 0x18 | FTM_DEC_DEV1; /* 0000,1101 不是能过滤,QUADMODE=1:count and direction mode;QUADIR=1:increasing;QUADEN=1 */ FTM_QDCTRL_REG(FTM2_BASE_PTR) = 0x0d; break; default: return E_OBJ; } return E_OK; }