你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
【2016.11.10】今日问题:stm32 电机控制低速测速问题
[复制链接]
zero99
提问时间:2016-11-10 07:09 /
签到,一人1金币
回答下面问题 2金币
stm32 电机控制低速测速问题
https://www.stmcu.org.cn/module/forum/thread-608271-1-1.html
社区活动:
【活动预告】STM32之王F769IDISCOVERY,邀您品鉴!
10月狂欢节中奖名单(已公布)
11月STM32粉丝狂欢节,开发板人人拿
L432项目分享奖——STM32请你来站台
学习机会:
【11月培训】STM32针对USB应用实战分享
【12月培训】STM32针对以太网(Ethernet)应用实战分享
产品前沿:
Valens和意法半导体合力推进车载信息网络技术革新
ST在2016德国慕尼黑电子元器件博览会上展出智能解决方案
契合物联网发展机遇,意法半导体推出STM32H7系列
STM32F7又增新产品线,预计2017年量产
赞
0
收藏
0
评论
102
分享
发布时间:2016-11-10 07:09
举报
请先
登录
后回复
102个回答
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 09:46:55
a0a.1 32b0c
签到了!
赞
0
评论
回复
支持
反对
andrewz
回答时间:2016-11-10 08:31:40
a0a.1 32b0c
到
赞
0
评论
回复
支持
反对
lisingch
回答时间:2016-11-10 07:31:39
a1024a.1 32b0c
签到了!
赞
0
评论
回复
支持
反对
areyouok
回答时间:2016-11-10 07:42:03
a1024a.1 32b0c
坚持签到
赞
0
评论
回复
支持
反对
anywill
回答时间:2016-11-10 07:44:20
a0a.1 32b0c
继续签到不间断
赞
0
评论
回复
支持
反对
wdshuang09
回答时间:2016-11-10 07:52:46
a0a.1 32b0c
签到
赞
0
评论
回复
支持
反对
车厘子
回答时间:2016-11-10 08:02:51
a1024a.1 32b0c
赞
0
评论
回复
支持
反对
原来的你
回答时间:2016-11-10 08:11:57
a1024a.1 32b0c
签到
签到
赞
0
评论
回复
支持
反对
yongjun
回答时间:2016-11-10 08:16:04
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
yanhaijian
回答时间:2016-11-10 08:16:37
a1024a.1 32b0c
天天签到。
赞
0
评论
回复
支持
反对
xuguomin
回答时间:2016-11-10 08:19:20
a1024a.1 32b0c
签到签到
赞
0
评论
回复
支持
反对
阿本
回答时间:2016-11-10 08:20:12
a0a.1 32b0c
签到签到
签到签到
赞
0
评论
回复
支持
反对
高二毛
回答时间:2016-11-10 08:27:34
a1024a.1 32b0c
每日签到。
赞
0
评论
回复
支持
反对
creep
回答时间:2016-11-10 08:27:38
a0a.1 32b0c
赞
0
评论
回复
支持
反对
peter001
回答时间:2016-11-10 08:30:05
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();
}
}
签到
签到
签到签到
签到签到