你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
【2016.11.10】今日问题:stm32 电机控制低速测速问题
[复制链接]
zero99
提问时间:2016-11-10 07:09 /
阅读主题, 点击返回1楼
赞
0
收藏
0
评论
102
分享
发布时间:2016-11-10 07:09
请先
登录
后回复
102个回答
shaoziyang
回答时间:2016-11-10 09:45:34
a0a.1 32b0c
签到
赞
0
评论
回复
支持
反对
falcon07@sina.c
回答时间:2016-11-10 09:46:17
a1024a.1 32b0c
签到了!
赞
0
评论
回复
支持
反对
党国特派员
回答时间:2016-11-10 09:46:55
a0a.1 32b0c
签到了!
赞
0
评论
回复
支持
反对
三好学生
回答时间:2016-11-10 09:50:37
a0a.1 32b0c
签到签到了!!
赞
0
评论
回复
支持
反对
qianfan
回答时间:2016-11-10 09:55:01
a1024a.1 32b0c
赞
0
评论
回复
支持
反对
shuishou
回答时间:2016-11-10 09:57:02
a1024a.1 32b0c
签到
签到
赞
0
评论
回复
支持
反对
x5y4z3
回答时间:2016-11-10 09:58:44
a0a.1 32b0c
※ 签到,签到!
赞
0
评论
回复
支持
反对
zhangdaijin
回答时间:2016-11-10 10:01:08
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
zhangdaijin
回答时间:2016-11-10 10:01:40
a1024a.1 32b0c
天天签到
赞
0
评论
回复
支持
反对
笑鸟007
回答时间:2016-11-10 10:03:28
a1024a.1 32b0c
签到QQQ
赞
0
评论
回复
支持
反对
wofei1314
回答时间:2016-11-10 10:16:39
a0a.1 32b0c
签到赚金币喽~
赞
0
评论
回复
支持
反对
JackieLaura
回答时间:2016-11-10 10:20:01
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
dear祝子
回答时间:2016-11-10 10:21:33
a0a.1 32b0c
两种方案:第一种就时STM32每个IO口都用按键中断,你可以牺牲一个定时器,当一个中断过来就计数,等待下一个中断进来后两者的差就得出了一个与速度相关的值,说句实话编码器没用过,我用的是HALL接口。这种方法是比较简单的,
第二种方法就是楼主所说的,定时器里面有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();
}
}
赞
0
评论
回复
支持
反对
北松
回答时间:2016-11-10 10:28:02
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
chenbourne
回答时间:2016-11-10 10:29:19
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
1
2
3
4
5
6
7
/ 7 页
下一页
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
签到
第二种方法就是楼主所说的,定时器里面有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();
}
}