打印
[STM32]

虾米求教——计数 电机霍尔反馈信号的次数

[复制链接]
1328|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linbo1|  楼主 | 2017-11-6 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2017-11-7 08:38 | 只看该作者
有些电机本身就是带霍尔传感器的,在转子转动时会发出脉冲信号,你采集这些脉冲信号就可以啊

使用特权

评论回复
板凳
linbo1|  楼主 | 2017-11-7 09:16 | 只看该作者
dirtwillfly 发表于 2017-11-7 08:38
有些电机本身就是带霍尔传感器的,在转子转动时会发出脉冲信号,你采集这些脉冲信号就可以啊 ...

是的,我也是这么想的,手上的这款电机是自带霍尔传感器的。

void TIM_Input_Init()
{
                                u16 arr,psc;
        {
                        GPIO_InitTypeDef GPIO_InitStructure;   //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO

                        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯¶¨Ê±Æ÷

                        TIM_ICInitTypeDef TIM4_ICInitStructure;//¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
                               
                        NVIC_InitTypeDef NVIC_InitStructure;

                        /* ¿ªÆôʱÖÓ */
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
                        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

                        /*  ÅäÖÃGPIOµÄģʽºÍIO¿Ú */
                        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
                        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING ;//
                        GPIO_ResetBits(GPIOD,GPIO_Pin_12);
                        GPIO_Init(GPIOD, &GPIO_InitStructure);

                        //TIM4¶¨Ê±Æ÷³õʼ»¯
                        TIM_DeInit(TIM4);
                        TIM_InternalClockConfig(TIM4);
                        TIM_TimeBaseInitStructure.TIM_Period = 1999;          
                        TIM_TimeBaseInitStructure.TIM_Prescaler = 3599;
                        TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//
                        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //
                        TIM_TimeBaseInit(TIM4, & TIM_TimeBaseInitStructure);

                //        GPIO_PinRemapConfig(GPIO_FullRemap_TIM4,ENABLE);//¸Ä±äÖ¸¶¨¹Ü½ÅµÄÓ³Éä        //pC7
               
                        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
                        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
                        NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //´ò¿ªTIM3_IRQnµÄÈ«¾ÖÖжÏ
                        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;        //ÇÀÕ¼ÓÅÏȼ¶Îª0
                        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;  //ÏìÓ¦ÓÅÏȼ¶Îª1
                        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //ʹÄÜ
                        NVIC_Init(&NVIC_InitStructure);       

                        //PWM³õʼ»¯          //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
                        TIM4_ICInitStructure.TIM_Channel=TIM_Channel_1;
                        TIM4_ICInitStructure.TIM_ICFilter=0x0;
                        TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling ;
                        TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1 ;
                        TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI ;
                       
                        TIM_ICInit(TIM4,&TIM4_ICInitStructure);
                       
                        TIM_ClearFlag(TIM4, TIM_IT_CC1);
                       
                        TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC3,ENABLE);
                       
                        TIM_Cmd(TIM4,ENABLE);//ʹÄÜ»òÕßʧÄÜTIMxÍâÉè
                        }
}


void TIM4_IRQHandler(void)   //TIM4??
{
        u16 count_num=0;  
          if(TIM_GetITStatus(TIM4, TIM_IT_CC1) == SET)//È·ÈÏÖÐ¶Ï ·¢Éú
        {
  //      TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);  //Çå³ýÖжÏ
        count_num++;
                                        if (count_num == 900)
                                        {
                                         TIM_Cmd(TIM3,DISABLE);
                                        }
        }
}
我真的是新手,始终做不到“count_num++”
我也曾想 读取管脚 状态,变量++,最终也是没有实现,真菜!

使用特权

评论回复
地板
linbo1|  楼主 | 2017-11-7 09:33 | 只看该作者
哪位大神有比较全的学习资料,我想认真学习一下。求购!
手上有开发板,但是资料不全。
我也是比较笨吧。

使用特权

评论回复
5
linbo1|  楼主 | 2017-11-7 16:41 | 只看该作者
问题已经解决,中断条件不对!

使用特权

评论回复
6
dirtwillfly| | 2017-11-8 08:59 | 只看该作者
linbo1 发表于 2017-11-7 16:41
问题已经解决,中断条件不对!

使用特权

评论回复
7
airwill| | 2017-11-8 20:53 | 只看该作者
霍尔信号反馈次数??都没有看明白是什么意思
ST 的电机库里有完整的代码, 不用外面寻求代码了

使用特权

评论回复
8
linbo1|  楼主 | 2017-11-13 14:00 | 只看该作者
airwill 发表于 2017-11-8 20:53
霍尔信号反馈次数??都没有看明白是什么意思
ST 的电机库里有完整的代码, 不用外面寻求代码了 ...

是计数  霍尔反馈个数..

使用特权

评论回复
9
airwill| | 2017-11-13 20:02 | 只看该作者
无刷电机的霍尔信号, 首先是用来换相的. 至于计数换算转速, 那是顺便的事情了

使用特权

评论回复
10
linbo1|  楼主 | 2017-11-16 13:37 | 只看该作者
本帖最后由 linbo1 于 2017-11-16 13:39 编辑
airwill 发表于 2017-11-13 20:02
无刷电机的霍尔信号, 首先是用来换相的. 至于计数换算转速, 那是顺便的事情了 ...


能给个 串口通讯,控制电机转动的示例吗?
简单点就是 使用串口 发送的数据 可控制电机的 转动距离。

比如:我串口发送 “4” , 那么它可以 赋给 全局变量“count_num”,这个“count_num”就是控制电机转动的圈数  PPR: 1  减速比  157.  具体的实现不了,不知道为什么?能给个示例吗?

使用特权

评论回复
11
airwill| | 2017-11-16 20:31 | 只看该作者
没有写过这样的程序, 给不了你.

不知道你的实现不了是什么意思, 电机不转, 还是转了不停

使用特权

评论回复
12
linbo1|  楼主 | 2017-11-17 20:27 | 只看该作者
airwill 发表于 2017-11-16 20:31
没有写过这样的程序, 给不了你.

不知道你的实现不了是什么意思, 电机不转, 还是转了不停 ...

void USART1_IRQHandler(void)        //
{
  static        u16 k;
        USART_ClearFlag(USART1,USART_FLAG_TC);
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)//
        {
                k=USART_ReceiveData(USART1);
                k++;               
                USART_SendData(USART1,k);//
                frequency_num=k;

"frequency_num"定义为 int 型全局变量;
frequency_num  怎么也赋了 k 的值;

我是很菜,在自学,手上的 资料不多,只是看了开发板的视频,才想学习这个;

使用特权

评论回复
13
airwill| | 2017-11-17 20:40 | 只看该作者
还是没有回答我的问题, 如果新手想入门, 最好不要拿这么复杂的东西硬啃.
无刷电机控制的门槛不低哦, 不适合自学
会打击积极性的

使用特权

评论回复
14
linbo1|  楼主 | 2017-11-17 20:50 | 只看该作者
airwill 发表于 2017-11-17 20:40
还是没有回答我的问题, 如果新手想入门, 最好不要拿这么复杂的东西硬啃.
无刷电机控制的门槛不低哦, 不适合 ...

大神:
是这样的,我目前能通过捕捉电机的反馈信号,控制电机转动一圈。
下面我是想  把串口的数据,赋给变量,再去循环 这个变量,就能实现控制电机转的圈数,我现在的问题是 可发送也能接收,但是这个变量“frequency_num“”赋不上串口发送过来的值;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝