управление мотором
- Войдите на сайт для отправки комментариев
народ, помогите чайнику
Такой вопрос. Нужно запрограммировать мотор, с помощью светового барьера http://www.ia.omron.com/data_pdf/data_sheet/ee-spx-w_dsheet_csm474.pdf следить за его вращением. Если контакт с фототранзистором теряется. тоесть счет циклов прикращается программа останавливает мотор.
Пока программа выглядит так:
int Motor=3; // Две ноги для управления мотором с помощью шим
int PWM=4; //
int duty cycle;
int Phototransistor=2;
int Zyklus;
volatile long x=0;
void setup(){
Serial.begin(9600);
pinMode(2, INPUT); // фотосенсор, цифровой вход
pinMode(3, OUTPUT); // мотор привязан к цыфровым выходам 3,4
pinMode(4, OUTPUT);
duty cycle=90;
attachInterrupt(0,count,RISING); // для фиксации циклов
}
void loop()
{
digitalWrite(4,LOW); // Направление вращения мотора
//digitalWrite(3, HIGH);
analogWrite(3, duty cycle);
}
void count() // функция для подсчета циклов
{
long value = x++; // или x++; для
Serial.println(value); //
}
Как можно написать функцию для того,чтобы мотор остановился ( duty cycle =0 ), если счет циклов больше не возможен. К мотору прикрепится шайба с отсутствующим сегментом, которая будет проходить через световой барьер
что значит
> 100) ?
http://arduino.ru/Reference/If
void loop()
{
if(millis()-x > 100)
{
// стоп машина!
}
.....
}
void count()
{
x = millis();
}
x это же не время, а количество циклов. А если просто взять и убрать рукой фототранзистор, тоесть контакт с мотором пропал. Эта функция сработает ?
Да, так как attachInterrupt(0,count,RISING); ловит именно фронт сигнала, то есть изменеие с 0 на 1, а значит если отключить датчик изменеий не будет.
Тоесть вот так правильно ( весь код)
int Motor=3; //
int PWM=4;
int duty cycle;
int Lichtschranke=2;
//int Zyklus;
volatile long x=0;
void setup(){
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
//digitalWrite(4,LOW);
//digitalWrite(3, HIGH);
duty cycle=90;
attachInterrupt(0,count,RISING);
}
void loop ()
{
digitalWrite(4,LOW);
analogWrite(3,duty cycle);
if (millis()-x>100)
{duty cycle=0}
void count()
{
x=millis();
}
а если Serial.print (x) то количество циклов не будет видно ?
посмотрите как правильно вставлять код в тему
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
а то читается тяжеловато да и принято так
не работает :(
Народ. подкиньте еще идейку ппиз
не работает :(
Опишите или покажите схему подключения датчика и двигателя.
В смысле использовал Ваш фрагмент кода, отключил датчик, но мотор продолжает крутится.
За какое время двигатель набирает рабочие обороты и вообще на каких оборотах работает двигатель?
отключил датчик, но мотор продолжает крутится.
ну попробую, я извеняюсь, конечно, а что это счет времени в if условии. Можно в двух словах?
Скопируйте начальные значения из монитора порта и вставьте сюда как код.
А что значит больше 3000? Если это важно мотор должен крутится 400 раз в минуту, поддерживая это количество оборотов.
Значит что в течении 3 секунд после старта отключения не будет, что бы двигатель успел раскрутиться.
А почему именно 3 секунды, просто не совсем уловил Вашу мысль.
А потому что вы на задаваеваемые вам вопросы не отвечаете.
Ну я ж говорю у меня мотор. расчитан на 4000 оборотов в холостую, при нагрузке на 400. Cкорость разбега зависит от скважности, да и в принципе не важна.
Ну так если вы знаете что важно, а что нет, то зачем тогда тему создавали?
Не хотите давать нужную информацию, тогда варитесь дальше сами, мне надоело просто так по клавиатуре стучать. Удаляюсь. Ожидайте телепатов и экстрасенсов, они помогут.
Ладно, скажите еще раз. какие параметры Вас интересуют? Количество оборотов 400 в минуту, с помощью сенсора считаются циклы, при потере связи с сенсором мотор останавливается.
#16
ок, спасиб. А можно как-то вставить условие для регулирования вращения. Ну, например каждые 5 секунд. Если крутится быстрее. замедляется, если медленнее, то ускоряется? Ну что-то типо (if Period-LOW>HIGH) { duty cycle=duty cycle+1);
ок
о! новая серия бесконечного сериала "летят два крокодила один зеленый другой в африку сколько ёжику лет"
:)
crecker, вам бесплатно помогают и тратят на это своё время. Вы или адекватно сотрудничайте с ПОМОГАЮЩИМ или ваши вопросы останутся без ответов. Здесь никто никому ничего не должен.
Еще разок:
Теперь что в мониторе?
Ну вот теперь видно, что двигатель довольно быстро набирает обороты, поэтому можно задержку снизить с 3 секунд до 1 или даже полусекунды. И видно что за оборот (одно срабатывание датчика) проходит около 10-20 миллисекунд. Если остановить двигатель или отключить датчик, то через 1 десютую секунды на 3 выводе дуины будет 0. Ну а на вопрос почему у вас не останавливается двигатель ответить можете только вы все по тем же причинам.
Про регулирование оборотов двигателя читайте тут.
Теперь срабатывает, большое спасибо. Добавил в interrupt еще y++, чтобы считать циклы паралельно с времени, вот тогда не срабатывает, то есть мотор крутится дальше.