专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
现在可以用编码器读取计数器的值了,但是怎么去测速呢?
2019-08-14 18:49
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
10286
28
1096
编码器怎么去测速呢?怎么通过PWM去控制直流电机呢?求教各位大神!最近在用直流电机,希望大家可以帮帮忙!谢谢啦!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
joe_knight
1楼-- · 2019-08-16 07:05
使用另一个定时器中断来进行周期测速,高频计数脉冲就是M/T法的M2,编码器计数是M1,测速的公式N= (60 * f0*M1) / (P*M2),式中,
P在你项目里是400*4,f0是测速高频脉冲定时器的频率;编码器A和B相,相位差90,每一个边沿会进行一次计数,那么每一线就是4次计数了;
对于M/T法测速,这里说的还比较详细:http://www.61ic.com/Article/C2000/C24X/200407/129.html
加载中...
张晓斌
2楼-- · 2019-08-16 12:02
回复【13楼】joe_knight:
---------------------------------
基本上明白了,太感谢了!
加载中...
张晓斌
3楼-- · 2019-08-16 18:01
回复【13楼】joe_knight:
---------------------------------
思路是不是这样啊!我用TIM2产生5ms中断,TIM3作为编码器计数。进入TIM2中断后,使能TIM3,然后M1=TIM3->CNT,M2=TIM2->CNT。这样的话M2应该是确定的就是TIM2的计时器预装载值,这样对吗?
加载中...
joe_knight
4楼-- · 2019-08-16 18:03
精彩回答 2 元偷偷看……
加载中...
张晓斌
5楼-- · 2019-08-16 18:03
回复【16楼】joe_knight:
---------------------------------
哦哦!如果还是TIM2产生5MS定时中断,那么进入TIM2中断后,应该使能TIM3和TIIM5,TIM5作为高频f0脉冲,这样就可以实现TIM3和TIM5的同步,然后M1=TIM3->CNT,M2=TIM5->CNT.测速的电机转速低,所以5MS应该可以了!通过M1计算得到弧长,也就是角位移,然后根据M2 f0可以得到脉冲时间,这样就可以得到转速。对了,在退出中断是得失能TIM3和TIM5.
加载中...
张晓斌
6楼-- · 2019-08-16 19:49
回复【16楼】joe_knight:
---------------------------------
void TIM5_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=1600;
TIM_TimeBaseInitStructure.TIM_Prescaler=71;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
//TIM_Cmd(TIM5,ENABLE);
}//TIM5作为高速脉冲计数
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=50-1;
TIM_TimeBaseInitStructure.TIM_Prescaler=7199;//定时5ms
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
u16 M1=0,M2=0;
TIM_Cmd(TIM3,ENABLE);
TIM_Cmd(TIM5,ENABLE);
M1=TIM3->CNT;
M2=TIM5->CNT;
n=60*(1000000)*M1/(M2*4*400);
TIM_Cmd(TIM3,DISABLE);
TIM_Cmd(TIM5,DISABLE);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
这样有什么问题吗?为什么测得的n一直是0呢?是按照那个思路啊?哪里不对啊?
加载中...
上一页
1
2
3
4
5
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
P在你项目里是400*4,f0是测速高频脉冲定时器的频率;编码器A和B相,相位差90,每一个边沿会进行一次计数,那么每一线就是4次计数了;
对于M/T法测速,这里说的还比较详细:http://www.61ic.com/Article/C2000/C24X/200407/129.html
---------------------------------
基本上明白了,太感谢了!
---------------------------------
思路是不是这样啊!我用TIM2产生5ms中断,TIM3作为编码器计数。进入TIM2中断后,使能TIM3,然后M1=TIM3->CNT,M2=TIM2->CNT。这样的话M2应该是确定的就是TIM2的计时器预装载值,这样对吗?
---------------------------------
哦哦!如果还是TIM2产生5MS定时中断,那么进入TIM2中断后,应该使能TIM3和TIIM5,TIM5作为高频f0脉冲,这样就可以实现TIM3和TIM5的同步,然后M1=TIM3->CNT,M2=TIM5->CNT.测速的电机转速低,所以5MS应该可以了!通过M1计算得到弧长,也就是角位移,然后根据M2 f0可以得到脉冲时间,这样就可以得到转速。对了,在退出中断是得失能TIM3和TIM5.
---------------------------------
void TIM5_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=1600;
TIM_TimeBaseInitStructure.TIM_Prescaler=71;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
//TIM_Cmd(TIM5,ENABLE);
}//TIM5作为高速脉冲计数
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=50-1;
TIM_TimeBaseInitStructure.TIM_Prescaler=7199;//定时5ms
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
u16 M1=0,M2=0;
TIM_Cmd(TIM3,ENABLE);
TIM_Cmd(TIM5,ENABLE);
M1=TIM3->CNT;
M2=TIM5->CNT;
n=60*(1000000)*M1/(M2*4*400);
TIM_Cmd(TIM3,DISABLE);
TIM_Cmd(TIM5,DISABLE);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
这样有什么问题吗?为什么测得的n一直是0呢?是按照那个思路啊?哪里不对啊?
一周热门 更多>