OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3440|回复: 2

新人请教带有霍尔编码器的直流减速电机怎样测速,求代码

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-7-20
在线时间
2 小时
发表于 2017-7-20 19:03:46 | 显示全部楼层 |阅读模式
1金钱
新人请教带有霍尔编码器的直流减速电机怎样测速,求代码!拜托了,急用

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2017-3-13
在线时间
24 小时
发表于 2017-7-20 20:52:42 | 显示全部楼层
测速的话,利用正点原子的输入捕获实验,捕获到跳变的高电平的值,然后乘二就是一个跳变的时间罗!再换算成速度的话我也不是特别明白了,看论坛有没有大佬吧。你要看电机是几对极的吧,这个要你自己去了解了,二对极的是一圈十二个跳变,然后再去换算吧!我也是最近刚开始弄测速,不过这个的测速存在边沿误差  而且得到的也不是通常意义的速度—平均速度,而是瞬时速度。这个需要你自己去处理,不然就用M/T做吧。我记得论坛有一个帖子 总结的很全面的  关于测速这一块 去找找呗      [mw_shl_code=c,true]void TIM1_CH2_Init(u16 arr,u16 psc)
{         

        TIM_ICInitTypeDef  TIM1_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);        //ê1ÄüTIM3ê±Öó
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);        //ê1ÄüGPIOA

        //3õê¼»ˉêäèë2¶»ñμÄêäèëòy½&#197A6¡£
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_2);//PA6òy½ÅÎa¸′óÃ1|Äü£¬AF1¸′óÃÎaTIM3CH1          //zz
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;                                                                                                                                                                                                                                        //zz
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //3õê¼»ˉ¶¨ê±Æ÷TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //é趨¼ÆêyÆ÷×Ô¶ˉ֨װÖμ
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //Ô¤·ÖÆμÆ÷   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
  
        //3õê¼»ˉTIM3êäèë2¶»ñ2Îêy
        TIM1_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ     //zz
  TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //éÏéyÑØ2¶»ñ
  TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3éäμ½TI1éÏ
// TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
  TIM1_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
  TIM_ICInit(TIM1, &TIM1_ICInitStructure);
       

        //ÖD¶Ï·Ö×é3õê¼»ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  //TIM3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_InitStructure.NVIC_IRQChannelPriority           = 0;
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       
        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC2,ENABLE);//ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï           //zz
   TIM_SetCounter(TIM1, 0);
        TIM_Cmd(TIM1,ENABLE );         //ê1Äü¶¨ê±Æ÷3
   


}

u8  TIM1CH2_CAPTURE_STA=0;        //êäèë2¶»ñ×′쬠                                                  
u16        TIM1CH2_CAPTURE_VAL;        //êäèë2¶»ñÖμ
void TIM1_CC_IRQHandler(void)   //TIM3ÖD¶Ï
{
       
        if((TIM1CH2_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ       
        {
    SpeedValue = 0000;          
                if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
                {            
                        if(TIM1CH2_CAPTURE_STA&0X40)//òѾ-2¶»ñμ½¸ßμçÆ½áË
                        {
                                if((TIM1CH2_CAPTURE_STA&0X3F)==0X3F)//¸ßμçÆ½ì«3¤áË
                                {
                                        TIM1CH2_CAPTURE_STA|=0X80;//±ê¼Ç3é1|2¶»ñáËò»′Î
                                        TIM1CH2_CAPTURE_VAL=0XFFFF;
                                }else TIM1CH2_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)//2¶»ñ1·¢éú2¶»ñê¼t  //zz
                {       
                        if(TIM1CH2_CAPTURE_STA&0X40)                //2¶»ñμ½ò»¸öϽμÑØ                
                        {       
                                TIM1CH2_CAPTURE_STA|=0X80;                //±ê¼Ç3é1|2¶»ñ¸ßμçÆ½
                                TIM1CH2_CAPTURE_VAL=TIM_GetCapture2(TIM1);                                   //zz
                           TIM_OC2PolarityConfig(TIM1,TIM_ICPolarity_Rising);//CC1P=0 éèÖÃÎaéÏéyÑØ2¶»ñ
                                TIM_SetCounter(TIM1,0);
                        }else                                                                  //»1Î′¿aê¼,μúò»′Î2¶»ñéÏéyÑØ
                        {       
                                TIM1CH2_CAPTURE_STA=0;                        //Çå¿Õ
                                TIM1CH2_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM1,0);
                                TIM1CH2_CAPTURE_STA|=0X40;                //±ê¼Ç2¶»ñμ½áËéÏéyÑØ
                           TIM_OC2PolarityConfig(TIM1,TIM_ICPolarity_Falling);                //CC1P=1 éèÖÃÎaϽμÑØ2¶»ñ
                        }                    
                }                                                                                   
        }

        TIM_ClearITPendingBit(TIM1, TIM_IT_CC2|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ        //zz
                       
                }[/mw_shl_code]
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-7-20
在线时间
2 小时
 楼主| 发表于 2017-7-21 16:36:58 | 显示全部楼层
XCN 发表于 2017-7-20 20:52
测速的话,利用正点原子的输入捕获实验,捕获到跳变的高电平的值,然后乘二就是一个跳变的时间罗!再换算成 ...

非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 18:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表