极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20152|回复: 12

问大家一个控制直流电机的问题。

[复制链接]
发表于 2012-6-4 17:54:17 | 显示全部楼层 |阅读模式
之前问过一个关于用电位计读取模拟电压值的问题,在这得到了一位朋友的帮助,非常感谢。

我现在还是在用Arduino Motor Shied rev3 这个控制电机的版子控制一个直流电机。这个电机连接着一个木杆,这个木杆又和电位计相连,木杆的转动角度能够通过电位计的电压来表述,我现在实现了电位计的模拟电压值通过Arduino的AnalogIn端口转换为数字电压值。我的问题是现在我不仅仅想让电机转动和停止,而是希望在给定的一个区间内让电机转动和停止,这个区间的最大和最小值是通过电位计的值决定的。

比如说通过转换后Arduino读取的最大值是500,最小值是100。我怎么能让电机转到400的时候就改变方向而转到200的时候又改变方向,也就是说把它限定在400到200的区间内。Arduino Motor Shied控制电机的程序好像本身无法实现。因为它只能控制电机的方向,正反和速度。我不知道是不是需要其他的方法。多谢各位的指教
回复

使用道具 举报

发表于 2012-6-5 09:38:24 | 显示全部楼层
你需要一个步进电机
回复 支持 反对

使用道具 举报

发表于 2012-6-5 09:42:13 | 显示全部楼层
不知道PWM是否能够满足你的要求,去研究研究一下。
回复 支持 反对

使用道具 举报

发表于 2012-6-5 11:08:06 | 显示全部楼层
用AnalogRead读取数值,用if语句进行判断,然后做出动作。。。不知道可不可以!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-5 14:53:42 | 显示全部楼层
arduino-tinker 发表于 2012-6-5 11:08
用AnalogRead读取数值,用if语句进行判断,然后做出动作。。。不知道可不可以!

嗯,我也一直在尝试if语句,到目前为止还不太行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-5 14:55:20 | 显示全部楼层
Randy 发表于 2012-6-5 09:42
不知道PWM是否能够满足你的要求,去研究研究一下。

嗯,谢了,考虑一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-5 14:56:14 | 显示全部楼层
公孙林 发表于 2012-6-5 09:38
你需要一个步进电机

不用步进电机或者servo应该也可以吧,我认为。
回复 支持 反对

使用道具 举报

发表于 2012-6-5 16:29:08 | 显示全部楼层
weilian 发表于 2012-6-5 14:56
不用步进电机或者servo应该也可以吧,我认为。

普通电机肯定不行吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-5 17:58:09 | 显示全部楼层
公孙林 发表于 2012-6-5 16:29
普通电机肯定不行吧

通过程序控制应该能行吧。
回复 支持 反对

使用道具 举报

发表于 2012-6-6 03:54:32 | 显示全部楼层
weilian 发表于 2012-6-5 17:58
通过程序控制应该能行吧。

普通电机要不就是不转,要不就有一定的转速。
要实现你说的情况首先你的电位计要十分的灵敏且接触良好。其实这里有个矛盾的,要接触良好就要有一定的压力。这样电机就要具备一定的扭力才能转动起来, 转起来固然也不会慢。
其次你的电机驱动板还要是带有反电动势保护二极管的那种。不然逆向电流会损坏驱动板。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-6 05:24:49 | 显示全部楼层
公孙林 发表于 2012-6-6 03:54
普通电机要不就是不转,要不就有一定的转速。
要实现你说的情况首先你的电位计要十分的灵敏且接触良好。 ...

嗯,你说的没错,非常感谢你的回复。我也觉得用步进电机或伺服电机应该更容易实现。

我用的是这个Arduino Motor Shield rev3电机驱动版,这个版非常简单的能够实现各种电机的控制,比如直流电机就可以用它非常容易的控制方向和转动速度。

关于电位计我可能前面描述的不太清楚,实际上我的电位计是固定在一根柱子上的,然后它和一个木杆相连,也就是说当这个木杆上下摆动,电位计就相应的跟着转动,可以说还是很灵敏的。
我觉得我的问题可能主要是出现在程序里,就是无法把电位计的值实时读出来返回给控制电机的函数做判断,比如说当电位计返回一个数字400的值,假设对应电压是4伏,那么我可以让电机在此时停下来,或者另一个方向转动。
回复 支持 反对

使用道具 举报

发表于 2012-6-7 23:06:18 | 显示全部楼层
L298只是个H桥,控制反转的的话问题不大,当读到的值大于等于400就反转,小于200就再正转呗。 难度只是取决于你要做到的这个区间的精度到底是怎么的,决定在你用的电位器的精度和电机的转速控制。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-8 16:21:07 | 显示全部楼层
Alexie 发表于 2012-6-7 23:06
L298只是个H桥,控制反转的的话问题不大,当读到的值大于等于400就反转,小于200就再正转呗。 难度只是取决 ...

非常感谢你的解答。

我使用的这个电机是汽车中控锁用的小电机,他是上下移动的,实际上他的构造内部是个直流电机,然后这个直流电机连接着齿轮和杠杆,这个电机通过直流电机控制而实现上下移动。
程序逻辑其实很简单,我现在觉得是不是电机的转速是问题所在,因为这个电机往一个方向转动的时候可以控制在400呢,但是往另一个方向的时候就不能控制在200内,而是直接转到0.

我把我的代码贴出来:
void setup() {
pinMode (9,OUTPUT);
pinMode (12, OUTPUT);
pinMode (12,INPUT);
//pinMode (pwm, OUTPUT);
Serial.begin(9600);

}

void motorStop(){
  digitalWrite(9,HIGH);//motor brake
  delay(2000);//2 Sec
}

void motorUp(){
  digitalWrite(12,HIGH);//one direction
  digitalWrite(9,LOW);//motor doesnt brake
  analogWrite(3,50);//motor speed   
  delay(1000);
}

void motorDown(){
    digitalWrite(12,LOW);//the other direction  
    digitalWrite(9,LOW);//motor doesnt brake
    analogWrite(3,50);//motor speed
    delay(1000);
}


int potiValue;//potentiometer value

void loop(){
  
  motorDown();//motor running in one direction
  if(potiValue=analogRead(A5),potiValue<200){
  motorStop();
  Serial.println(potiValue);}//if the  poti value less than 200
  motorUp();
  if(potiValue=analogRead(A5),potiValue>400){
  motorStop();
  Serial.println(potiValue);//if the  poti value bigger than 400
  }

回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-6 13:30 , Processed in 0.044456 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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