Проверьте схему выдавливания флюса из шприца.

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

сейчас провожу отладку на arduino nano 3.0 с atmega 328p-au. и возникла проблема, все работает, мотор крутится, скорость потенциометром изменяется, но не так, как мне надо.
вот если я выключаю питание, и выкручиваю потенциометр, потом включаю, то он понимает значение и вращает мотор в соответствии с ним, но если плата запитана, кнопка вращения зажата или не зажата, а потенциометр вращаю, то изменения скорости не происходит.

как это поправить?
вот кусок кода:

Спойлер

Код: Выделить всё

#include <mega328p.h>
#include <delay.h>
void main(void)
{
/*** Настройка портов ***/
DDRC = 0x00; // Порт SW_rotate: PС0-SPEED. SW_push: PС1-FORWARD, PС2-BACK
PORTC |= (1 << PORTC1); // Подключаем нагрузочный резистор к PC1
//PORTC |= (1 << PORTC2); Подключаем нагрузочный резистор к PC2
DDRB = 0x00; // Порт выхода
PORTB = 0xFF; // Устанавливаем "0" на выходе

// Инициализация АЦП
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // Предделитель преобразователя на 8
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3) // Вход PC0
|(1<<REFS0)|(0<<REFS1); // AVcc является опорным напряжением

while (1)
{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2*u/3;

while (2)
{
if(PINC&(1 << PINC1)) // Проверяем нажатие кнопки FORWARD
{
PORTB &= ~(1 << PINB0); // Выключаем ШИМ PD1
PORTB &= ~(1 << PINB1); // Выключаем ШИМ PD1
PORTC &= ~(1 << PINC2); // Низкий уровень v_power
}
else
{
PORTB |= (1 << PINB0); // Включаем ШИМ PB1
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PINB1); // Включаем ШИМ PB2
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB1
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB2
delay_ms(3*t/2); // Задержка потенциометра мс

PORTC |= (1 << PINC2); // Высокий уровень v_power
}
}
}
}


p.s. это пока отладка для одной кнопки - вперед, для кнопки - назад уже техническая формальность будет добавить.
p.s.s. пробовал зацикливать вот эту строчку: while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования, однако тогда программа вообще не получает значение переменной, т.к. похоже окончания преобразования не происходит.
как быть?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Прошу проверить правильность схемы.

Сообщение СКАЗОЧНИК »

Код не смотрел, но подразумеваю, что у вас в момент инициализации МК происходит обработка значения АЦП с потенциометра. А когда нажата кнопка, то программа уходит в обработчик нажатия кнопки, где используется уже определенное значения АЦП, заданное заранее.
Вам всего лишь надо сделать так, чтобы при уходе в обработчик нажатия кнопки в нем внутри опрашивался АЦП и корректировал значения ОН-ЛАЙН. :) и так по кругу, пока кнопка нажата, тогда он будет реагировать на сопротивление в момент того, как крутит двигатель.
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

Конечно для бывалых форумчан это будет и ужасом, но вот такой вот у меня тестовый стенд: тестовый стенд
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

to СКАЗОЧНИК, огромное спасибо, засунул кусок с преобразованием под цикл с кнопкой и все заработало!

блин, а я мучаюсь уже который день, а оказывается так все просто =)

вот код:
Спойлер

Код: Выделить всё

#include <mega328p.h>
#include <delay.h>
void main(void)
{
/*** Настройка портов ***/
DDRC = 0x00; // Порт SW_rotate: PС0-SPEED. SW_push: PС1-FORWARD, PС2-BACK
PORTC |= (1 << PORTC1); // Подключаем нагрузочный резистор к PC1
//PORTC |= (1 << PORTC2); Подключаем нагрузочный резистор к PC2
DDRB = 0x00; // Порт выхода
PORTB = 0xFF; // Устанавливаем "0" на выходе

// Инициализация АЦП
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // Предделитель преобразователя на 8
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3) // Вход PC0
|(1<<REFS0)|(0<<REFS1); // AVcc является опорным напряжением



while (1)
{
if(PINC&(1 << PINC1)) // Проверяем нажатие кнопки FORWARD
{
PORTB &= ~(1 << PINB0); // Выключаем ШИМ PD1
PORTB &= ~(1 << PINB1); // Выключаем ШИМ PD1
PORTC &= ~(1 << PINC2); // Низкий уровень v_power
}
else
{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2*u/3;
{
PORTB |= (1 << PINB0); // Включаем ШИМ PB1
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PINB1); // Включаем ШИМ PB2
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB1
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB2
delay_ms(3*t/2); // Задержка потенциометра мс

PORTC |= (1 << PINC2); // Высокий уровень v_power
}
}
}
}
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

все таки накаркал.
делаю все так же, кнопки работают, но обратное положение вместо вращения дергание.
как сделать обратное вращение?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Прошу проверить правильность схемы.

Сообщение СКАЗОЧНИК »

Как на шаговом обратное делать не знаю... Может две "фазы" местами поменять? :dont_know:
З.Ы. Тем более на обратном вращении не надо регулировать скорость...
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

ах вот оно как. =)
в общем, из второго цикла убрал преобразователь по потенциометру и все заработало.
хотя все равно не понимаю почему так, ведь если кнопка не нажата цикл не должен проходить и должен пропускаться.
правда я еще на всякий случай переставил шаговик - поставил шаговик, от объектива камеры (очень маленький на 3,3 вольта, зато с хорошими подшипниками, без биения, как у движка из FDD для эксперементов).
в общем теперь в обе стороны крутится идеально, вот код:
Спойлер

Код: Выделить всё

#include <mega328p.h>
#include <delay.h>
void main(void)
{
/*** Настройка портов ***/
DDRC = 0x00; // Порт SW_rotate: PС0-SPEED. SW_push: PС1-FORWARD, PС2-BACK
PORTC |= (1 << PORTC1); // Подключаем нагрузочный резистор к PC1
PORTC |= (1 << PORTC2); // Подключаем нагрузочный резистор к PC2
DDRB = 0x00; // Порт выхода
PORTB = 0xFF; // Устанавливаем "0" на выходе

// Инициализация АЦП
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // Предделитель преобразователя на 8
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3) // Вход PC0
|(1<<REFS0)|(0<<REFS1); // AVcc является опорным напряжением

while (2)
{
if (PINC&(1 << PINC1)) // Проверяем нажатие кнопки FORWARD
{
PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB1
PORTC &= ~(1 << PINC3); // Низкий уровень v_power
}
{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2*u/3;
{

PORTB |= (1 << PINB0); // Включаем ШИМ PB0
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PINB1); // Включаем ШИМ PB1
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB0
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB1
delay_ms(3*t/2); // Задержка потенциометра мс

PORTC |= (1 << PINC3); // Высокий уровень v_power

if (PINC&(1 << PINC2)) // Проверяем нажатие кнопки BACK
{
PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB1
PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB0
PORTC &= ~(1 << PINC3); // Низкий уровень v_power
}

PORTB |= (1 << PINB1); // Включаем ШИМ PB1
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PINB0); // Включаем ШИМ PB0
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PINB1); // Выключаем ШИМ PB1
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PINB0); // Выключаем ШИМ PB0
delay_ms(3*t/2); // Задержка потенциометра мс

PORTC |= (1 << PINC3); // Высокий уровень v_power
}
}
}

}


p.s. хоть он и работает, и вроде как очень даже не плохо, но все равно может я что не так делаю, и можно сделать лучше.
посмотрите пожалуйста?
все действия произвожу в codevisionAVR.

p.s.s. кстати если нажимать обе кнопки, то его глючит, он пытается сделать и то и то, и в итоге начинает дрыгаться.
как сделать что бы если он схватил одну кнопку, вторую уже не видел ни под каким соусом?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Прошу проверить правильность схемы.

Сообщение СКАЗОЧНИК »

flimp писал(а): что не так делаю, и можно сделать лучше.
посмотрите пожалуйста?
все действия произвожу в codevisionAVR.

Я пишу обычно на ассемблере и в АВРСтудио. Поэтому, здесь кто-то другой может поможет вам...

flimp писал(а):как сделать что бы если он схватил одну кнопку, вторую уже не видел ни под каким соусом?

А здесь походу у вас обработка кнопок идет обеих сразу в одном цикле.... :dont_know:
Надо примерно так:
Опрашиваются кнопки по очереди (или ждут прерывания, смотря где они у вас подключены).
Словили нажатие одной кнопки (любой) и ушли в ее обработчик (подпрограмму), и там уже в цикле крутимся до тех пор, пока кнопка нажата, т.е. в цикле ее переопрашиваем внутри обработчика. Как только словили, что кнопка больше не нажата, то выходим из подпрограммы и снова идем на главный цикл, где отслеживаем обе кнопки.
Аналогично для второй.
Тогда он будет реагировать только на одну кнопку и игнорировать двойное зажатие... А если их нажать одновременно (что все равно никогда не получится, т.к. одна сработает быстрее), то он выберет именно ту, что быстрее нажалась, а вторую все равно будет игнорить. Как-то так.
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

to СКАЗОЧНИК, огромное Вам спасибо!
с работой не было времени позаниматься моим проектом, но сейчас нашел, и наконец разобрался как сделать вариант, когда нажата одна кнопка и он бы не обращал внимание на вторую. по Вашим словам ввел переменную и до тех пор пока кнопка нажата, второй цикл просто не запускается. =)
вот переработанный код: (стандартно для меня уже в CVAVR)
Спойлер

Код: Выделить всё

#include <mega328p.h>
#include <delay.h>
void main(void)
{
/*** Настройка портов ***/
DDRC = 0x00; // Порт SW_rotate: PС0-SPEED. SW_push: PС1-FORWARD, PС2-BACK
PORTC |= (1 << PORTC1); // Подключаем нагрузочный резистор к PC1
PORTC |= (1 << PORTC2); // Подключаем нагрузочный резистор к PC2
DDRB = 0x00; // Порт выхода
PORTB = 0xFF; // Устанавливаем "0" на выходе

// Инициализация АЦП
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // Предделитель преобразователя на 8
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3) // Вход PC0
|(1<<REFS0)|(0<<REFS1); // AVcc является опорным напряжением

while (1)
{
unsigned int per;
per=0;

while (per==0)
{
if (PINC&(1 << PORTC1)) // Проверяем нажатие кнопки FORWARD
{
PORTC &= ~(1 << PORTC3); // Низкий уровень v_power
PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
per=per+1;
}

else

{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2 * u / 3;

{
PORTC |= (1 << PORTC3); // Высокий уровень v_power

PORTB |= (1 << PORTB0); // Включаем ШИМ PB0
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PORTB1); // Включаем ШИМ PB1
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
delay_ms(3*t/2); // Задержка потенциометра мс
}
}
}


while (per==1)
{
if (PINC&(1 << PORTC2)) // Проверяем нажатие кнопки BACK
{
PORTC &= ~(1 << PORTC3); // Низкий уровень v_power
PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
per=per-1;
}

else

{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2 * u / 3;

{
PORTC |= (1 << PORTC3); // Высокий уровень v_power

PORTB |= (1 << PORTB1); // Включаем ШИМ PB1
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PORTB0); // Включаем ШИМ PB0
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
delay_ms(3*t/2); // Задержка потенциометра мс
}
}
}


}
}

Вот теперь думаю как бы отказаться delay_ms(XXXX), что бы сделать вариант с полуавтоматом, что бы когда я кнопку FORWARD отпускаю он делал пару оборотов назад, что бы убрать избыточное давление, а следовательно что бы не вытекала паяльная паста/флюс.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Прошу проверить правильность схемы.

Сообщение СКАЗОЧНИК »

Я ни разу не вник в вашу программу... Просто я в Си пока плохо понимаю, а еще и для всяких КодеВижн. А еще и Делаи эти. :facepalm: :)))
Зачем вам избавляться от Делая?

Вам просто надо добавить где-то в тексте программы сразу после того, как прошла обработка кнопки "Вперед", т.е. мы отпустили кнопку и из обработчика вышли И попали сразу же на пару строчек, которые повернут мотор в обратную сторону на два оборота. И чтобы попадал он туда только после того, как отпустили кнопку "Вперед".

Пока кнопка нажата, то он крутится вперед, толкает пасту, а мы тем временем крутимся в обработчике кнопки и все время проверяем нажата она или нет, там же проверяем АЦП и регулируем скорость. После того, как кнопку отпустили, он должен из него выйти (выйти из обработчика), а перед выходом дернуть мотор в обратную сторону на пару оборотов.


Еще смотрите, что у вас вперед может быть одно нажатие короткое, просто для проверки или если шприц полный, а назад он сделает все равно два оборота и выдернет поршень. )))) Поэтому должен быть какой-то концевик для этого что ли.

З.Ы. Программка у вас странная... И ИМХО для такого МК маловата. :) Я это называю - из пушки по воробьям. Но не обращайте внимания на меня.
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

to СКАЗОЧНИК, таки я тут google поштудировал, и люди пишут, что delay_ms(XXXX) не очень хорошая штука, с ней могут быть проблемы. правда я не совсем понял какие, а если быть честным, то совсем не понял, но раз пишут, то наверное в этом есть смысл. =)

я пытаюсь, используя delay_ms(XXXX) организовать обратный ход на 1-2 оборота при отжатии кнопки FORWARD, но пока не получается.

на счет концевиков я думал, и идея очень хорошая. можно повесить их на PORTC3 && PORTC4 и при их срабатывании отключать движение по направлению, однако, как организовать это механически я понимаю лишь для случая, когда поршень сдвигается назад, т.е. в механизм, а вот как установить конечное значение по передвижению поршня вперед не представляю, т.к. шприцы то хоть и стандартные, но разной длины.
например паяльная паста имеет три типоразмера шприцов, а значит и три длинны и диаметра при стандартном креплении (оно конечно слегка отличается, но в целом унифицировано и можно ставить в выбранный мною разъем).
в то же время всякие УФ поляризуемые клеи имеют четвертый тип шприца, равный второму типоразмерному для паяльной пасты по диаметру, но длиннее раза в полтора того же второго.

более того пока не представляю пока еще, как программно это организовать что-бы при срабатывании концевика цикл моментально останавливался, а значит прекращалось движение поршня.

причем с другой стороны у нас же шаговик. вот например я его пальцами останавливаю и он начинает просто попискивать.
и по этому писку можно догадаться отжать кнопку, так что страшного ничего не произойдет.

p.s. на счет программы и МК - у меня еще 10 новеньких, ни разу не используемых atmega8 лежат.
таки что имею, то и использую. =)
p.s.s. программу отрабатываю на arduino nano, поэтому там библиотека atmega328, но когда будет финальный реализ, просто поменяю #include <mega328p.h> на #include <mega8.h>.
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

кстати, у кого нибудь в Москве есть возможность сделать мне на 3D ЧПУ из пластика пару деталей? (естественно не бесплатно)
а то я тут на работе поспрашивал ребят и они сказали, что сделать сделаем, но я так подсчитал, вес конечно неприлично большой, даже если использовать Д16чАТ. не говоря уже про Ст30, 30ХГСА.

p.s. механическая часть в siemens nx 8.5.
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Прошу проверить правильность схемы.

Сообщение flimp »

реализовал обратный ход после отпуска кнопки FORWARD:

Спойлер

Код: Выделить всё

#include <mega328p.h>
#include <delay.h>
void main(void)
{
/*** Настройка портов ***/
DDRC = 0x00; // Порт SW_rotate: PС0-SPEED. SW_push: PС1-BACK, PС2-FORWARD
PORTC |= (1 << PORTC1); // Подключаем нагрузочный резистор к PC1
PORTC |= (1 << PORTC2); // Подключаем нагрузочный резистор к PC2
DDRB = 0x00; // Порт выхода
PORTB = 0xFF; // Устанавливаем "0" на выходе

// Инициализация АЦП
ADCSRA |= (1 << ADEN) // Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // Предделитель преобразователя на 8
ADMUX |= (0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3) // Вход PC0
|(1<<REFS0)|(0<<REFS1); // AVcc является опорным напряжением

while (1)
{
unsigned int per, i, k; // Переменные счетчиков цикла
per=0;
i=0;
k=0;

// Действия с кнопкой BACK

while (per==0)
{
if (PINC&(1 << PORTC1)) // Проверяем нажатие кнопки BACK
{
PORTC &= ~(1 << PORTC3); // Низкий уровень v_power
PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
per = per + 1; // Счетчик цикла подхвата одной кнопки
}

else

{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2 * u / 5; // Переменная задержек

{
PORTC |= (1 << PORTC3); // Высокий уровень v_power

PORTB |= (1 << PORTB0); // Включаем ШИМ PB0
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PORTB1); // Включаем ШИМ PB1
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
delay_ms(3*t/2); // Задержка потенциометра мс
}
}
}

// Действия с кнопкой FORWARD

while (per==1)
{
if (PINC&(1 << PORTC2)) // Проверяем нажатие кнопки FORWARD
{
PORTC &= ~(1 << PORTC3); // Низкий уровень v_power
PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
per = per - 1;  // Счетчик цикла подхвата одной кнопки

}

else

{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2 * u / 5;  // Переменная задержек

{
PORTC |= (1 << PORTC3); // Высокий уровень v_power

PORTB |= (1 << PORTB1); // Включаем ШИМ PB1
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PORTB0); // Включаем ШИМ PB0
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
delay_ms(3*t/2); // Задержка потенциометра мс

i = 1; // Флаг вызова цикла реверса
}
}
}


// Реверс после отжатия FORWARD

if (i>=1) // Цикл реверса после отжатия FORWARD
while (k<30) // Длительность реверса
{
unsigned int u,t;
ADCSRA |= (1 << ADSC); //Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0) //Ждем флага окончания преобразования
u = (ADCL|ADCH << 8); // Считываем ADC
t = 2 * u / 5;  // Переменная задержек

{
PORTC |= (1 << PORTC3); // Высокий уровень v_power

PORTB |= (1 << PORTB0); // Включаем ШИМ PB0
delay_ms(t); // Задержка потенциометра мс

PORTB |= (1 << PORTB1); // Включаем ШИМ PB1
delay_ms(t/2); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
delay_ms(2*t); // Задержка потенциометра мс

PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
delay_ms(3*t/2); // Задержка потенциометра мс

k = k + 1;
}
}

else

{
PORTC &= ~(1 << PORTC3); // Низкий уровень v_power
PORTB &= ~(1 << PORTB0); // Выключаем ШИМ PB0
PORTB &= ~(1 << PORTB1); // Выключаем ШИМ PB1
}


}
}


кто-то скажет, что способ крайне примитивен и это все равно, что бросаться грудью на пулеметы, как говорил один очень уважаемый мною профессор в ВУЗе.
но никак иначе я пока еще не умею. =)

p.s. а как при таком коде организовать антидребезг?
а то пробовал после определения кнопки вводить даже delay_ms(1000), но не обрабатывает. жму кнопку, и по идее только после секунды должен запускаться цикл, но этого не происходит, запускается сразу.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение СКАЗОЧНИК »

flimp писал(а):как при таком коде организовать антидребезг?

Примерно так, как вы и делаете. После нажатия кнопки делать задержку в районе 100 мсек. Плюс-минус. От кнопки зависит и др. условий. Также, пусть первый раз опрос прошел и определил кнопку и запустил какое-то событие. Но кнопка еще нажата! А программа быстрая. Поэтому (возможно) надо поставить задержку перед очередным опросом кнопки. ))) Тут каждый раз смотреть надо по обстоятельствам.
Кстати, а что у вас с таким количеством задержек для всяческого управления еще и дребезг кнопок ловит?

А если у вас Делай не держит 1 сек, то возможно вы не указали в начале программы частоту тактирования микроконтроллера, откуда эта процедура (делай) берет данные для расчета задержек.
Также, стоит посмотреть про Делай как таковые вообще. Там может он не может более определенного времени считать. Могу и ошибаться, т.к. давно это видел, забыл.
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение flimp »

Кстати, а что у вас с таким количеством задержек для всяческого управления еще и дребезг кнопок ловит?

неа, не ловит вообще, но кнопки то у в моем импровизированном тестовом стенде хорошие. со страх 386 системников, тогда то компы на века делались, это сейчас существует понятие срока жизни.
по сути своей это просто перестраховка, т.к. я не знаю откуда еще буду брать их для финального реализа.
покупать то уж точно не буду, ведь проект задумывается именно, как бюджетное решение, т.е. делать максимально из того, что либо лежит еще новехоньким, либо можно спаять с горы старых плат, коих у меня если честно просто вагон и маленькая тележка. (на работе, когда всю ерунду списывали - домой себе забрал, весь балкон забит =) )


p.s. мелкомягкая мышка начала 2000 (одна из первых оптических) до сих пор работает отлично в то время, как все логитеки, которые у меня были накрывались за максимум 6 месяцев, с отказом кнопок. приходилось какие то кнопки перепаивать, а на подошву каких то клеить жестяные пластинки,
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение flimp »

таки не выдрежал и все таки заказал на всем известном китайце пятивольтовый униполярный шаговик 28-BYJ48 с драйвером на uln2003a. просто в качестве интереса.
так вот, вчера пришел и используя в качестве стенда arduino nano в противовес моему биполярнику с H-most на lb1656 схема разводки и программа, где просто с заданной задержкой бесконечно перещелкиваем 4 контакта по кругу - в разы проще, как и разводка легче. вчера за 5 минут прогу наваял и еще пять на подключение.
и вот теперь думаю, а что же применить в конечном реализе:
- этот новый шаговик, в котором уже встроен редуктор, но он мне кажется не достаточно компактным.
- или один из моих биполярных, но к нему колхозить редуктор. редуктор кстати снял со своей машины, там накрылся привод стеклоподъемника, так вот сам моторчик уже заменил на новый, а этот раздеранид - движок в мусор, а вот редуктор там маленький, компактный и с небольшой доработкой к нему более чем реально прикрутить биполярный движок от дисковода.
учитывая все плюсы и минусы что подскажите?

p.s. разница в подлючении:
СпойлерИзображение

uln2003a (для униполярника) куда проще оказалось разводить, чем lb1656 (для биполярника).
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение flimp »

не удержался и все таки заказал шаговик с редуктором. очень маленький, но при этом очень мощный.
теперь переделаю корпус под него разберусь с тем, как добавить экранчик и буду паять)
видео - https://youtu.be/C9gycF2H0vE
СпойлерИзображение
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение СКАЗОЧНИК »

Зачем там экранчик? :shock:

З.Ы. На видео прикольно работает. :beer:
Станислав
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение flimp »

СКАЗОЧНИК писал(а):Зачем там экранчик? :shock:

таки если делать, то делать красиво.)
хочу на него вывести уровень заряда батареи, прикрутил ее к схеме уже.
и от 12v отказываюсь, сюда по моей макетке все отлично и на 5 вольт работает.
так что оставляю 3,3v (для экранчика) и 5v. плюс анимацию вращения винта, а так же параметры скорости и примерного остатка паяльной пасты/флюса (просчитать по объемам и заложить в прогу).
экранчик собираюсь ставить вот такой вот:
СпойлерИзображение

на всем известном китайском сайте заказал уже распаянный с I2C интерфейсом, 4-ех ногий, две из которых 5v и GND.
как доедет, а потом разобравшись, как его прикрутить, так и буду уже включать в схему уже распаивая на основной плате.

p.s. начал освоение экранов под atmega, но пока очень тяжко.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Проверьте схему выдавливания флюса из шприца.

Сообщение СКАЗОЧНИК »

Можно ссылку на этот экранчик?
Станислав
Ответить

Вернуться в «Теория»