马达控制定时器 – MCTM
▄ 2 个16 位向上、 向下、 向上 / 向下自动加载计数器
▄ 16 位可编程分频器对计数器时钟频率进行分频, 分频比为 1 : 65536▄ 输入捕捉功能
▄ 比较匹配输出
▄ PWM 波形产生功能, 具有边沿对齐和中心对齐两种计数模式
▄ 单脉冲输出模式
▄ 带可编程死区时间插入的互补输出
▄ 编码器接口控制器, 带有两个使用正交解码器的输入口
马达控制定时器包括一个 16 位向上 / 向下计数器、 四个 16 位 CCRs( 捕捉 / 比较寄存器 ) 、 一
个 16 位计数器重装载寄存器 (CRR) 、 一个 8 位重复计数器和几个控制 / 状态寄存器。它可用
于多种用途, 包括测量输入信号的脉冲宽度或产生输出波形, 如比较器匹配输出、 PWM 输出
或带死区时间插入的互补 PWM 输出。 MCTM 支持的编码器接口带有两个输入端口的增量
解码器。 MCTM 能够为马达控制、 霍尔传感器接口和制动输入提供全功能支持。
正交解码器
要选择正交解码器模式, 应把 MDCFR 寄存器中的 SMSEL 字段设为 0x1 、 0x2 或 0x3 。 正交解码
器功能使用两个输入口,即 MTn_CH0 和 MTn_CH1 引脚来产生时钟脉冲以驱动计数器预分频器。
在每一个输入源信号发生转换时, 计数器方向位 DIR 的值都会被硬件自动修改。
要选择正交解码器模式, 应把 MDCFR 寄存器中的 SMSEL 字段设为 0x1 、 0x2 或 0x3 。 正交解码
器功能使用两个输入口,即 MTn_CH0 和 MTn_CH1 引脚来产生时钟脉冲以驱动计数器预分频器。
在每一个输入源信号发生转换时, 计数器方向位 DIR 的值都会被硬件自动修改。
MCTM0编码器模式配置初始化
//编码器MCTM0
//MT0_CH0 PA14
//MT0_CH1 PB0
void MCTM0_Init(void)
{
MCTM_TimeBaseInitTypeDef TimeBaseIniture; //结构体
MCTM_OutputInitTypeDef OutIniture;
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
//捕获IO口的设置 MT0_CH0 PA14
CKCUClock.Bit.PA = 1; //GPIOA时钟打开
CKCUClock.Bit.AFIO = 1; //复用时钟
CKCUClock.Bit.MCTM0 = 1; //开启马达定时器
CKCU_PeripClockConfig(CKCUClock, ENABLE); //时钟使能
HT32F_DVB_GPxConfig(GPIO_PA, GPIO_PIN_14, AFIO_MODE_4); //开启复用功能
//捕获IO口的设置 MT0_CH1 PB0
CKCUClock.Bit.PB = 1; //GPIOA时钟打开
CKCUClock.Bit.AFIO = 1; //复用时钟
CKCUClock.Bit.MCTM0 = 1; //开启马达定时器
CKCU_PeripClockConfig(CKCUClock, ENABLE); //时钟使能
HT32F_DVB_GPxConfig(GPIO_PB, GPIO_PIN_0, AFIO_MODE_4); //开启复用功能
GPIO_InputConfig(HT_GPIOA, GPIO_PIN_14, ENABLE); //使能输入功能
GPIO_InputConfig(HT_GPIOB, GPIO_PIN_0, ENABLE); //使能输入功能
MCTM_DeInit(HT_MCTM0); //恢复默认设置
MCTM_TimeBaseStructInit(&TimeBaseIniture);
//对定时器时基以及计数方式初始化
TimeBaseIniture.CounterMode=MCTM_CNT_MODE_UP; //边沿对齐向上计数
TimeBaseIniture.CounterReload=768*2*4; //计数重装载计数器
TimeBaseIniture.Prescaler=0; //预分频系数
TimeBaseIniture.PSCReloadTime=MCTM_PSC_RLD_IMMEDIATE; //立即重装载预分频寄存器
TimeBaseIniture.RepetitionCounter=1; //定时器重复寄存器
MCTM_TimeBaseInit(HT_MCTM0, &TimeBaseIniture);
MCTM_DecoderConfig(HT_MCTM0, MCTM_SMSEL_DECODER3, //模式3双边沿计数
MCTM_CHP_NONINVERTED, MCTM_CHP_NONINVERTED); //编码器模式的设置
MCTM_ChExternalClockConfig(HT_MCTM0, MCTM_TRSEL_TI0BED, MCTM_CHP_INVERTED, 6);//比较滤波器
MCTM_ClearFlag(HT_MCTM0, MCTM_FLAG_UEV1);
MCTM_IntConfig(HT_MCTM0, 1, ENABLE); //开启
//设置中断优先级 不知道这个参数设置是否有问题
// NVIC_EnableIRQ(MCTM0UP_IRQn); //允许外部中断 这里有问题
// NVIC_SetPriorityGrouping(MCTM0UP_IRQn);
// NVIC_SetPriority(MCTM0UP_IRQn, NVIC_EncodePriority(MCTM0UP_IRQn, 0, 1)); //设置中断优先级
// NVIC_SetPendingIRQ(MCTM0UP_IRQn);
HT_MCTM0->CNTR=768*4; //计数器初始值
MCTM_Cmd(HT_MCTM0,ENABLE); //使能计数器
}
count=768*4-TIM4->CNT; //获取真实脉冲数
TIM4->CNT =768*4; //计数值的初始化