HT1656 马达控制定时器 – MCTM 正交编码器模式

马达控制定时器 – 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 的值都会被硬件自动修改。

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;     //计数值的初始化





                                                                                                                                                                                                                                         CQUT——YL

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值