打印
[技术讨论]

电位器控制无刷直流电机的疑惑

[复制链接]
1708|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# 基础知识介绍:
现在需要做一个小东西,目的是需要用遥感控制电机,电位器如下图,很简单,四个引脚VCC、GND、VX、VY,通过旋转摇杆位置,VX/VY可以输出0-3.3V电压值。

电机用的是直流无刷电机,还带驱动板,驱动芯片是GC4931,仿的TI的A4931,见下图

简单介绍下直流无刷电机,一般有8根线、三个动力线U_U、U_V、U_W、五个霍尔信号线HALL_U、HALL_V、HALL_W、GND、+5V
使用GC4931驱动的话,只需要两个信号线即可将电机驱动起来

都为TTL电平
DIR:低电平正转、高电平反转
ENABLE:PWM调速信号,低电平全速运转

实现思路:
先将驱动板通电,将DIR、ENABLE都接地,可以看到电机转起来了,此时观察到电机从0°转90°的时间为0.9s
那么电机转1°用的时间就是0.9s/90°=0.1s/度=100ms/度
主控用STM32F103的开发板,电位器只用到一路VX,连到单片机ADC脚
当我不旋转摇杆的时候,此时的电压为1.6V左右,记为V_start
当我旋转摇杆到我最终位置时,记下此时电压为V_over
有了上面的基本参数,我就知道了最终位置电机要转动的时间t=(V_over-V_start)*0.1
<blockquote>int main(void)
参考原子代码如上,下载后发现效果和理想存在偏差,拨动摇杆,电机并不会随之转动,我觉得问题可能出现在单片机的ADC采样频率上,我希望得到的是我的摇杆初始位置和最终位置的一个电压差值,可是单片机一直在进行ADC采样,它并不知道我需要的初始位置和最终位置在哪,最终导致了结果失败,很可惜最终我也没有成功驱动起来。
我还想了两个思路,一个是用定时器替代delay函数,记得好像在哪看到说尽量少用delay函数,会造成单片机效率低下。
一个也是用定时器的输入捕获,通过霍尔传感器反馈的方波来判断电机运转的位置,从而控制电机的停止。
鉴于个人水平有限,对定时器的使用还有待加强,目前还处于理论状态,未进行实际验证。


PS:1.希望有大佬看到后可以提供下建议和意见
2.其实直流无刷电机并不是这么玩的,一般都需要用霍尔传感器进行闭环控制,我这么玩其实是比较low的
3.其实这个芯片还有一些其他脚,只不过接两个信号就可以简答驱动,附件为规格书和厂家参考原理图
GC4931开关霍尔参考原理图).PDF (159.25 KB) GC4931说明书V1.4.pdf (1.3 MB)





1108261852be3b6582.png (50.75 KB )

1108261852be3b6582.png

使用特权

评论回复

相关帖子

沙发
王小琪|  楼主 | 2021-11-5 21:22 | 只看该作者
代码好像没上传成功,补上
int main(void)
{         
        u16 adc_start;
        u16 adc_over;
        float v_start;
        float v_over;
        float number;//电位器初始位置和最终位置差值
        float time;//电机从初始位置到最终位置要运行的时间
        delay_init();                                    
        Adc_Init();                            
        while(1)
        {
                adc_start=Get_Adc_Average(ADC_Channel_1,10);
                v_start=(float)adc_start*(3.3/4096);
                delay_ms(10);       
               
                adc_over=Get_Adc_Average(ADC_Channel_1,10);
                v_over=(float)adc_over*(3.3/4096);
                delay_ms(10);       
               
                number=v_over-adc_start;//点位置初始位置和最终位置的差值
                if(number>0.1)
                {
                        if(number>0.1)
                        time=number*100;
                        ENABLE=0;//电机全速正转
                        DIR=0;
                        delay_ms(time);
                        ENABLE=1;//电机停止
                        DIR=1;
                }
                if(number<0.1)
                {
                        if(number<0.1)
                        time=number*100;
                        ENABLE=0;//电机全速反转
                        DIR=1;
                        delay_ms(time);
                        ENABLE=0;//电机停止
                        DIR=1;
                }
        }
}

使用特权

评论回复
板凳
QuakeGod| | 2021-11-6 21:01 | 只看该作者
说了半天,你根本没说你想要干啥,
也就是你的需求是啥。

你说,你想要用摇杆控制电机,到底是咋个控制法,
往前就正传, 往后就反转? 还是 往前就快,往后就慢?
还是往前的过程中 就正转, 往后的过程中就反转?

使用特权

评论回复
评论
王小琪 2021-11-7 21:36 回复TA
1.转速一定,所以不存在你说的快慢 2.摇杆转动幅度大小和电机转动的角度成正比。举个栗子,摇杆往左转10°,电机正转10°;摇杆往右转10°,电机反转10°。 
地板
congfenglong| | 2021-11-8 08:50 | 只看该作者
你说的这都什么和什么啊,如果使用旋转电位器,初始化的时候要读电位器的ADC值作为初始值的,你初始化没有读任何ADC值吧?再一个看你说的这个摇杆,应该是默认在1.6V,也就是说低于1。6V的时候是正传,大于1.6V是反转,转动的速度是和你说的电压差有关,所有问题的关键就是,硬件上你需要预先知道一个默认的遥感ADC初始值范围

使用特权

评论回复
评论
王小琪 2021-11-8 21:03 回复TA
1.初始化没有读ADC是我默认摇杆在中间,电压为1.6,当电压在1.5-1.7我就认为没有拨动摇杆。 2.转动的速度是固定的,并不存在和什么压差有关 3.我认为问题的关键是ADC的采样频率和实际操作摇杆的速度 
5
tianxj01| | 2021-11-8 09:15 | 只看该作者
走的真远,不就是一个典型的舵机就可以扮演的角色吗?

使用特权

评论回复
评论
王小琪 2021-11-8 21:03 回复TA
可以理解为要用无刷电机实现舵机的效果 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

227

主题

578

帖子

6

粉丝