你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
查看全部评分
dzzwoaizi 发表于 2016-11-10 11:55 两种方案:第一种就时STM32每个IO口都用按键中断,你可以牺牲一个定时器,当一个中断过来就计数,等待下一 ...
dapan100 发表于 2017-7-25 09:11 我用了两个定时器实现的,TIM2设成hall模式测脉冲间隔并送出触发信号给tim3,tim3配制成计数模式 ...
zhanghankui 发表于 2017-7-25 15:44 将TIM2接口的CH1 CH2输入送到TIM3是怎么实现的,还请指教
dapan100 发表于 2017-7-25 15:46 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE); TIM_ITRxExternalClock ...
zhanghankui 发表于 2017-7-25 15:49 这样TIM3计数怎么识别正反转呢
dapan100 发表于 2017-7-25 15:51 这里没用正交解码,如果要识别的只能进中断了
第二种方法就是楼主所说的,定时器里面有hall接口,同时可以捕获定时器的值,还是以HALL为例,配置好后会每60度(电角度)进入中断一次,同事进入后捕获开始,也就是定时器开始计数。计数出来的值就是电机转过60度的时间(电角度)。配置我会截图给你,其实还可以计数跑了多少个PWM周期。在PWM中断里计数。通常他们是这莫做的,应为在FOC中可以简化运算。不知道你的编码器是咋样回事了,但是都应该通用的。
配置如下:
//GPIO
GPIO_InitTypeDef GPIO_InitStructure;
//Interrupt
NVIC_InitTypeDef NVIC_InitStructure;
//Tmer
TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //死区刹车结构体变量定义
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure; //定义结构体变量
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//---------------------------------TMER3 HALL------------------------------
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_0);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_0);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 47; //TIM基本初始化
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period =65535;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC ; //配置通道为输入,并映射到哪里
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入捕获预分频值
TIM_ICInitStructure.TIM_ICFilter = 10; //输入滤波器带宽设置
TIM_ICInit(TIM3, &TIM_ICInitStructure); //输入通道配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //TIM输出通道初始化
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse =65535;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_SelectHallSensor(TIM3,ENABLE); //使能TIMx的霍尔传感器接口
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED); //输入触发源选择
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); //从模式选择
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择
// TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref );//选择输出触发模式(TRGO端)
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //开TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE); //开定时器中断
TIM_ClearFlag(TIM3, TIM_FLAG_Trigger);
TIM_ClearFlag(TIM3, TIM_FLAG_CC4);
TIM_Cmd(TIM3,ENABLE);
//中断入口。
void TIM3_IRQHandler(void)
{
if((TIM_GetFlagStatus(TIM3,TIM_FLAG_Trigger)) != RESET )
{
TIM_ClearITPendingBit(TIM3, TIM_FLAG_Trigger);
HallPLLCtrl();
}
}
评分
查看全部评分
楼主问的是编码器模式和捕获模式同时开启,M法测高速,T法测低速,你给他回答霍尔传感。。。。。。。。。。。。
将TIM2接口的CH1 CH2输入送到TIM3是怎么实现的,还请指教。如果只是单纯把TI1F_ED送出来不行吧,编码器接口功能计脉冲数要有要有两个脉冲输入才能自动识别方向实现加减
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE);
TIM_ITRxExternalClockConfig(TIM3, TIM_TS_ITR1);
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_SelectHallSensor(TIM2, ENABLE);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1F_ED);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC1);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 9;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
这样TIM3计数怎么识别正反转呢
这里没用正交解码,如果要识别的只能进中断了
这样的问题就是送到TIM3的脉冲不能直接拿来累加计数,因为不知道是正向脉冲还是反向脉冲,。
只一个方向转是没问题