问大家一个控制直流电机的问题。
之前问过一个关于用电位计读取模拟电压值的问题,在这得到了一位朋友的帮助,非常感谢。我现在还是在用Arduino Motor Shied rev3 这个控制电机的版子控制一个直流电机。这个电机连接着一个木杆,这个木杆又和电位计相连,木杆的转动角度能够通过电位计的电压来表述,我现在实现了电位计的模拟电压值通过Arduino的AnalogIn端口转换为数字电压值。我的问题是现在我不仅仅想让电机转动和停止,而是希望在给定的一个区间内让电机转动和停止,这个区间的最大和最小值是通过电位计的值决定的。
比如说通过转换后Arduino读取的最大值是500,最小值是100。我怎么能让电机转到400的时候就改变方向而转到200的时候又改变方向,也就是说把它限定在400到200的区间内。Arduino Motor Shied控制电机的程序好像本身无法实现。因为它只能控制电机的方向,正反和速度。我不知道是不是需要其他的方法。多谢各位的指教:)
你需要一个步进电机 不知道PWM是否能够满足你的要求,去研究研究一下。 用AnalogRead读取数值,用if语句进行判断,然后做出动作。。。不知道可不可以! arduino-tinker 发表于 2012-6-5 11:08 static/image/common/back.gif
用AnalogRead读取数值,用if语句进行判断,然后做出动作。。。不知道可不可以!
嗯,我也一直在尝试if语句,到目前为止还不太行。 Randy 发表于 2012-6-5 09:42 static/image/common/back.gif
不知道PWM是否能够满足你的要求,去研究研究一下。
嗯,谢了,考虑一下。 公孙林 发表于 2012-6-5 09:38 static/image/common/back.gif
你需要一个步进电机
不用步进电机或者servo应该也可以吧,我认为。 weilian 发表于 2012-6-5 14:56 static/image/common/back.gif
不用步进电机或者servo应该也可以吧,我认为。
普通电机肯定不行吧 公孙林 发表于 2012-6-5 16:29 static/image/common/back.gif
普通电机肯定不行吧
通过程序控制应该能行吧。 weilian 发表于 2012-6-5 17:58 static/image/common/back.gif
通过程序控制应该能行吧。
普通电机要不就是不转,要不就有一定的转速。
要实现你说的情况首先你的电位计要十分的灵敏且接触良好。其实这里有个矛盾的,要接触良好就要有一定的压力。这样电机就要具备一定的扭力才能转动起来, 转起来固然也不会慢。
其次你的电机驱动板还要是带有反电动势保护二极管的那种。不然逆向电流会损坏驱动板。 公孙林 发表于 2012-6-6 03:54 static/image/common/back.gif
普通电机要不就是不转,要不就有一定的转速。
要实现你说的情况首先你的电位计要十分的灵敏且接触良好。 ...
嗯,你说的没错,非常感谢你的回复。:handshake我也觉得用步进电机或伺服电机应该更容易实现。
我用的是这个Arduino Motor Shield rev3电机驱动版,这个版非常简单的能够实现各种电机的控制,比如直流电机就可以用它非常容易的控制方向和转动速度。
关于电位计我可能前面描述的不太清楚,实际上我的电位计是固定在一根柱子上的,然后它和一个木杆相连,也就是说当这个木杆上下摆动,电位计就相应的跟着转动,可以说还是很灵敏的。
我觉得我的问题可能主要是出现在程序里,就是无法把电位计的值实时读出来返回给控制电机的函数做判断,比如说当电位计返回一个数字400的值,假设对应电压是4伏,那么我可以让电机在此时停下来,或者另一个方向转动。 L298只是个H桥,控制反转的的话问题不大,当读到的值大于等于400就反转,小于200就再正转呗。 难度只是取决于你要做到的这个区间的精度到底是怎么的,决定在你用的电位器的精度和电机的转速控制。 Alexie 发表于 2012-6-7 23:06 static/image/common/back.gif
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 thepoti value less than 200
motorUp();
if(potiValue=analogRead(A5),potiValue>400){
motorStop();
Serial.println(potiValue);//if thepoti value bigger than 400
}
页:
[1]