Небольшая программка
- Войдите на сайт для отправки комментариев
ТЗ Такое:
Устройство такое. Есть штанга, управляющая частотным преобразователем с двумя концевиками. Имеет два положения, внизу и вверху.
На штанге вращающаяся стрелка с мотором постоянного двигателя. Управляется ШИМом
Устройство имеет 2 программы:
1) Штанга стоит на верхнем концевике, светится диод программы 1
При однократном нажатии кнопки штанга опускается до нижнего концевика, диод программы 1 моргает. По приходу на концевик реле подъема выключается, диод 1 программы гаснет, загорается диод программы 2
2)Штанга стоит на нижнем концевике, светится диод программы 2
При нажатии кнопки начинает вращаться стрелка с плавным разгоном и торможением. Стрелка делает 8.5 оборотов, после чего останавливается и срабатывает подъем штанги наверх до срабатывания верхнего концевика.
Во время работы программы 2, светодиод программы 2 мигает.
По приходу на верхний концевик система возвращается к программе 1.
Счет происходит путем проходов магнитов на диске через 2 датчика Холла. Всего 8 магнитов по кругу для счета положения и 1 магнит во втором ряду для счета оборотов.
Так же есть отдельная кнопка для ручного вращения стрелки в нижнем положении штанги. Имеет плавный старт по удержанию и плавный стоп по отпусканию.
Скетч выглядит вот так, но на данный момент имеет несколько ошибок, например ложное срабатывание кнопки пуска или самостоятельное включение реле подъема. Нужен нормальный код :)
#include <Arduino.h>
#define REL_UP 19 //Пин реле "Вверх"
#define REL_DN 0 //Пин реле "Вниз"
#define MOTOR 10 //Пин ШИМа мотора
#define DIRECT 9 //Пин включения реверса
#define MAN 4 //Пин кнопки ручного вращения
#define LED_PR1 5 //Пин светодиода программы "1"
#define LED_PR2 7 //Пин светодиода программы "2"
#define LIM_UP 15 //Пин верхнего концевика
#define LIM_DN 13 //Пин нижнего концевика
#define SW 8 //Пин кнопки
#define PCB_LED 1 //Пин диода на плате
#define C_SENS 2 //Пин датчика 1 (прерывание 1 )
#define H_SENS 3 //Пин датчика 2 (прерывание 2 )
#define INTERVAL1 500 //Интервал мигания диода на плате (мС)
#define INTERVAL2 250 //Интервал мигания диода программы (мС)
class noDELAY {
public:
unsigned long previous;
unsigned long interval;
boolean s;
boolean tick;
noDELAY() {
previous = millis();
s = 0;
tick = 0;
}
void stop() {s = 0; }
void start() {s = 1; }
void read(unsigned long _interval) {
interval = _interval;
unsigned long current = millis(); tick = 0;
if (s == 0) {previous = current; }
if (current - previous > interval) {previous = current; tick = 1;}
}
};
bool prog = 0; //Номер программы 0-первая 1-вторая
volatile byte counter = 1; //Счетчик импульсов
byte spd; //Скорость
volatile byte loops = 0; //Количество оборотов
int startTime; //Время разгона
int stopTime; //Время торможения
byte val; //Значение ШИМа скорости
bool state = 0; //Состояние кнопки для программы 2
bool stt = 0; //Состоянте кнопки для ручного управления
noDELAY timer1;
noDELAY timer2;
noDELAY timer3; //Таймеры
noDELAY timer4;
void setup() {
pinMode(REL_UP, OUTPUT); //Режимы и стартовые уровни
pinMode(REL_DN, OUTPUT);
pinMode(MOTOR,OUTPUT);
pinMode(DIRECT,OUTPUT);
pinMode(LED_PR1,OUTPUT);
pinMode(LED_PR2,OUTPUT);
pinMode(PCB_LED,OUTPUT);
pinMode(SW, INPUT_PULLUP);
pinMode(C_SENS, INPUT_PULLUP);
pinMode(H_SENS, INPUT_PULLUP);
pinMode(MAN, INPUT_PULLUP);
pinMode(LIM_UP, INPUT);
pinMode(LIM_DN, INPUT);
digitalWrite(REL_UP, LOW);
digitalWrite(REL_DN, LOW);
digitalWrite(MOTOR , LOW);
digitalWrite(LED_PR1, LOW);
digitalWrite(LED_PR2, LOW);
digitalWrite(LIM_UP, LOW);
digitalWrite(LIM_DN, LOW);
digitalWrite(C_SENS, HIGH);
digitalWrite(H_SENS, HIGH);
digitalWrite(SW, HIGH);
digitalWrite(MAN, HIGH);
digitalWrite(PCB_LED, LOW);
digitalWrite(DIRECT, LOW); //Направление вращения
//attachInterrupt(0,increase, FALLING);
//attachInterrupt(1,loopcounter, FALLING);
timer1.start();
timer2.start();
timer3.start();
timer4.start();
startTime = map(analogRead(A4), 0, 1023, 0, 40); //Опрос регуляторов скорости и старт/стопа
stopTime = map(analogRead(A3), 0, 1023, 0, 50);
spd = map(analogRead(A2), 0, 1023, 0, 254);
}
void increase(){
counter+=1;
}
void loopcounter(){
loops+=1;
}
void loop() { //Старт цикла
if(loops > 10) {loops = 0;}
if(digitalRead(C_SENS) == LOW && digitalRead(H_SENS) == LOW || counter > 6) {counter = 0;} //Сброс счетчиков
timer1.read(INTERVAL1); //Генератор морганий диода на плате
timer2.read(INTERVAL2); //Генератор морганий диодов программы
timer3.read(startTime); //Таймер разгона
timer4.read(stopTime); //Таймер торможения
if (timer1.tick) {digitalWrite(PCB_LED, !digitalRead(PCB_LED));} //Генератор морганий диода на плате
if (val < spd && timer3.tick && digitalRead(MAN)== LOW && digitalRead(LIM_DN)== HIGH){ //Ручное вращение
stt=1;
val++;
analogWrite(MOTOR, val);
}
else if(stt==1 && val > 0 && timer4.tick && digitalRead(MAN)== HIGH){
val--;
analogWrite(MOTOR, val);
}
if(prog == 0 && !digitalRead(REL_DN) == HIGH) { //Включение диода программы 1 в режиме ожидания
digitalWrite(LED_PR1, HIGH);
digitalWrite(LED_PR2, LOW);
}
else if((prog == 0 && digitalRead(REL_DN) == HIGH)){ //Включение диода программы 1 в режиме работы
if (timer2.tick) {
digitalWrite(LED_PR1, !digitalRead(LED_PR1));
}
}
if(digitalRead(SW)== LOW && prog == 0) { //Запуск реле программы 1
digitalWrite(REL_DN, HIGH);
digitalWrite(REL_UP, LOW);
}
if(digitalRead(LIM_DN)== HIGH){ //Остановка программы 1 по концевику
digitalWrite(REL_DN, LOW);
prog = 1;
}
if(prog == 1 && val <= 5) { //Включение диода программы 2 в режиме ожидания
digitalWrite(LED_PR1, LOW);
digitalWrite(LED_PR2, HIGH);
}
else if( (prog == 1 && val > 5) || digitalRead(REL_UP) == HIGH ) { //Включение диода программы 2 в режиме работы
if (timer2.tick) {digitalWrite(LED_PR2, !digitalRead(LED_PR2));}
}
if (digitalRead(SW)== LOW && prog==1 && digitalRead(LIM_DN)== HIGH) { //Состояние кнопки для программы 2
state=1;
}
if (val < spd && timer3.tick && state==1){ //Запуск программы 2, плавный старт мотора
stt=0;
val++;
}
else if (loops >=8 && counter >= 4 && prog==1 && val > 0 && timer4.tick){
val--;
analogWrite(MOTOR, val);
}
if(loops >=8 && counter >=5 && prog==1){
digitalWrite(MOTOR, 0);
}
if(loops >=8 && counter >=4 && prog==1){
digitalWrite(REL_UP, HIGH);
}
if(digitalRead(LIM_UP)==HIGH){ //Выключение всего по приходу на верхний концевик
digitalWrite(REL_UP, LOW);
analogWrite(MOTOR, 0);
prog = 0; //Переход к программе 1
counter = 0;
loops = 0;
state=0;
val = 0;
}
} //Конец цикла
чертежик или эскизик хорошо бы, как по механике, так и по электронике, но в общем замечаний два - подсчет по просто герконам очень очень помехонеустойчивый алгоритм, не случайно в промышленных энкодерах 2 выходы, со сдвигом фазы на 90°, это позволяет уйти от накопления ошибки, то же по подсчету числа оборотов. Добавив по датчику Холла таким образом, чтобы один срабатывал с запозданием относительно другого, вы можете обеспечить намного более помехоустойчивую работу. Ну и второе замечание- если вам нужна надежность, то лучше конечно код писать на честном С, а не на имитации С для домохозяек. Но могу и на arduino ide написать, я также собираю макет, проверяю на макете в работе, так что вы получите проверенный рабочий код. Пишите ydom@mail.ru , решим вопрос. У меня большой опыт автоматизации чего угодно от цветомузыкальных фонтанов до цехов и хим. производств, список есть в ветке http://arduino.ru/forum/ishchu-ispolnitelya/spisok-ispolnitelei
Эскиз нирисую. Опрос происходит по двум датчикам Холла и 9-ти магнитам
Эскиз нирисую. Опрос происходит по двум датчикам Холла и 9-ти магнитам
а хорошо бы еще по датчику холла на счетчик положения и на счетчик оборотов. Тогда вы получите не просто два датчика, а два энкодера. Энкодеры намного более устойчивы к помехам и чему угодно еще, чем просто датчики на одном герконе. Поверьте или почитайте в вики. Кстати, конденсаторы для подавления дребезга стоят?
Ну и по электронике хорошо бы эскизик, с обозначениями хотя бы функциональными- важно ведь, какие драйвера стоят (в железном смысле) , те же шаговики есть 2 фазные, есть 4 фазные, есть униполярные, есть биполярные, и драйвера к ним разные, с разной логикой работы.
Датчика Холла два. Этого хватает и для счета оборотов и для счета положения. Диск и датчики уже стоят на конструкции, так что изменить ничего нельзя.
У датчиков стоит классическая обвязка из конденсатора и подтягивающего резистора. Кстати я не помню дребезга у цифрового Холла
Датчика Холла два. Этого хватает и для счета оборотов и для счета положения. Диск и датчики уже стоят на конструкции, так что изменить ничего нельзя.
У датчиков стоит классическая обвязка из конденсатора и подтягивающего резистора. Кстати я не помню дребезга у цифрового Холла
ну нельзя так нельзя.
Дребезг не самого датчика, конечно, имеется в виду вся конструкция - биение(люфт) может быть больше расстояния сработки датчика.
Датчика Холла два. Этого хватает и для счета оборотов и для счета положения. Диск и датчики уже стоят на конструкции, так что изменить ничего нельзя.
У датчиков стоит классическая обвязка из конденсатора и подтягивающего резистора. Кстати я не помню дребезга у цифрового Холла
ну нельзя так нельзя.
Дребезг не самого датчика, конечно, имеется в виду вся конструкция - биение(люфт) может быть больше расстояния сработки датчика.
Онкель, у него не дребезг, а пила генерится то ли программно т.к. он тупит заюзать класс титановый велосипед для тактовой кнопки, то ли аппаратно в момент выхода датчика Холла из магнитного поля.
*походу, он сам не понимает, откуда у него ложные срабатывания берутся.
Нет никаких ложный срабатываний. Сейчас конфликтует программный пуск и ручное вращение
клапуций. помоги плиз. зайди и что нибудь напиши. чат комнату "сделал". а хз она работает или нет
http://www.chatlist.su/arduino/
Да да. И мне помогите.
а тебе зачем. ты сам справишься или забьешь)) тут важнее задача. чат)))
Мне сейчас это очень нужно. Если кто напишет, решим с возмедностью
так я же не мешаю кому то написать. наоборот поддерживаю твою статью на этой странице в списке недавних тем на форуме. жди
сейчас все операторы заняты. но ваш звонок очень важен для нас))
хотя небольшой/большой совет тебе дам: представь что ты не в курсе дел и первый раз это читаешь, ты сам однозначно поймешь что нужно? а если нет что действительно нужно указать, а что дополнительно. слышал в вопросе половина ответа и т.д.
Нет никаких ложный срабатываний. Сейчас конфликтует программпримерный эскиз. На диске верхнее положение с двумя магнитами. Верхние считают импульсы положения, нижний -счетчик оборотов
не, не могу въехать. А где датчики положений штанги, какое другое положение штанги?
клапуций. помоги плиз. зайди и что нибудь напиши. чат комнату "сделал". а хз она работает или нет
http://www.chatlist.su/arduino/
вошёл, протестил...
боже бой. я пустил клапуция в чат))))
боже бой. я пустил клапуция в чат))))
на колени, холопы!
А у штанги 2 концевика, верх и низ. Соотв +5в на пинах концевиков
заходи в тему. больше людей шире морда, или я перепутал))
А у штанги 2 концевика, верх и низ. Соотв +5в на пинах концевиков
не , не въехать . Может фотка есть? У дуги со стрелкой- где ось, к чему относится? Вы уж постарайтесь поточнее объяснить. Да и с моторами - что за драйвера?
... и это форум ардуино, ....
и эта ветка -
так что не возбраняется предложить не только решение на железке ардуино, написанное на arduino ide, но и рабочее решение на той же самой железке. Вторая версия (рабочее решение) часто не совпадает с первой (код сгенерированный arduino ide). Когда будет не так, я первый повыкидываю студии, СV, iar и mdk и буду и atmega328, и sam3, да и вроде как обещали и на stm32 cделать клон- и буду все на arduino ide писать. Но пока ситуация такова какова она есть.
Так. У штанги ось почти наверху. Управляется частотником, тянется тельфером 1.5кв. Мотор стрелки 24в, 10а.
Сфоткать все это в ближайшие 2 дня не смогу, так как оно частично в лежачем состоянии. Длинна штанги 8м, стрелки 6.5м :)
В качестве драйвера готовый блок управления мотором. На входе принимает ШИМ с МК.
Понимаю, что это не мегавыгодный проект, но на помощь я все таки надеюсь. Сейчас есть код, который работает с проблемами. Если кто поможет отладить с меня пиво/деньги на мобилу или еще что то, в общем договоримся.
Так же можно написать код с нуля более профессионально, но это уже обговорим отдельно. Сейчас срочно нужна хотя бы моя работающая версия
Оплата 10 000р
То на 100 рублей кидаются, а то 10 000 им не надо. От народ!))
Фотку нормальную пришлите, и более детальное тз ydom@mail.ru плиз. Тогда можно будет начать думать. А так исходных данных маловато.
Пока решили отказаться от процессора в пользу резисторного управления.
А какие исходные данные Вам нужны? Зажать реле по одному условию и отпустить по другому
То пиво, то 10к. То процессор, то резистор! Какие то крайности, не находите?
Условия ставит начальство. Резистор поставили временно, так как программа все равно нужна, а работать надо.
ТЗ в первом сообщении
Дык, это за 10к или за резистор ?
Закрываю тему. Исполнитель найден