Страница 1 из 1

вертикально перемещающаяся платформа на PIC16F876

Добавлено: Пт окт 15, 2010 13:31:28
twise
Здравствуйте, для начала я обрисую кратко насколько можно свою систему, а затем и задам вопрос по ней
В общем у меня вертикально перемещающаяся платформа на 900 мм максимум...задание производится двумя кнопками + и - соответственно и кнопкой старт для запуска всей этой фигни, ну плюс еще сброс...сделано на шаговом двигателе с дискретностью 1мм

вот алгоритм может кривой, но по другому не выходит
111111.png
алгоритм
(32.8 КБ) 402 скачивания
вот собственно код самой проги( программируем пик на выполнение собственно того что нам нужно)

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

#include <pic.h>
//определяем переменные
const char DIG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
const char SPOT[3]={0x4,0x2,0x1};
char VL[3];
char NSPOT=0;
signed char nstep;
int C, N=0,M;
//опускаем платформу вниз
void DOWN(void)        
{
    while(C!=N && RB3!=0)
    {
    for(char i=0; i<200; i++)
    switch(nstep)
        {
        case 0: RB4=1;  RB5=0;  RB6=0;  RB7=0;  break;
        case 1: RB4=0;  RB5=1;  RB6=0;  RB7=0;  break;
        case 2: RB4=0;  RB5=0;  RB6=1;  RB7=0;  break;
        case 3: RB4=0;  RB5=0;  RB6=0;  RB7=1;  break;
        }
    C--;
    VL[0]=C/100;
    VL[1]=(C%100)/10;
    VL[2]=C%10;
!!!!!!!!!!!!!!!!!!!!!!!
_delay(5); вот собственно и вопрос я здесь пытаюсь организовать задержку, так как двигатель шаговый то нужно организовать задержку между его шагами около 5мс...
я смог это сделать только делеем, но видимо это не правильно и нужно бы придумать какое то дополнительно условие при котором будет организована та самая задержка
!!!!!!!!!!!!!!!!!!!!!!!

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

    nstep--;
    if(nstep<0)
        nstep=3;
    }
}
//поднимаем платформу вверх
void UP(void)        
{
    while(C!=N)
    {
    for(char i=0; i<200; i++)
    switch(nstep)
        {
        case 0: RB4=1;  RB5=0;  RB6=0;  RB7=0;  break;
        case 1: RB4=0;  RB5=1;  RB6=0;  RB7=0;  break;
        case 2: RB4=0;  RB5=0;  RB6=1;  RB7=0;  break;
        case 3: RB4=0;  RB5=0;  RB6=0;  RB7=1;  break;
        }
    C++;
    VL[0]=C/100;
    VL[1]=(C%100)/10;
    VL[2]=C%10;
аналогичная ситуация

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

    nstep++;
    if(nstep>3)
        nstep=0;
    }
}
//прерывание от таймера - вывод на информации на индикаторы
void interrupt _int()
{
T0IF=0;
TMR0=100;
PORTA=SPOT[NSPOT];
PORTC=DIG[VL[NSPOT]];
NSPOT++;
if(NSPOT>2)
    {
    NSPOT=0;
    }
}

void main(void)
{
//настройка микросхемы 
ADCON1=    0x7;
TRISA =    0x0;
OPTION= 0x4;
TRISB = 0x0F;
PORTB = 0x0;
TRISC = 0x0;
PORTC = 0x0;
T0IE  = 0x1;
GIE   = 0x1;
T0IF  = 0x0;
TMR0  =0x60;
//опускаем платформу до 0 при включении
C=900;
DOWN();
C=0;
VL[0]=0;
VL[1]=0;
VL[2]=0;
    
while(1)//сканируем кнопки каждые 50мс
    {
for(unsigned int i=0; i<3150; i++);//50мс
    if(RB1==0)//если пользователь нажимает старт
        {
        M=N-C
            if(M<0)
                DOWN();//вниз
            if(M>0)
                UP();//вверх
        }
    if(RB0==0)    N--;//если пользователь нажимает вниз
    if(RB2==0)    N++;//если пользователь нажимает вверх
    if(N<0)    N=900;// если пользователь хочет узнать, что есть ниже нуля
    if(N>900)    N=0;//если пользователь хочет узнать, что есть выше 900
    VL[0]=N/100;
    VL[1]=(N%100)/10;
    VL[2]=N%10;
    }
}
Я конечно понимаю что я криво объяснился, но сделал как мог, если что то нужно еще добавить для полноты информации только скажите)

Re: вертикально перемещающаяся платформа на PIC16F876

Добавлено: Пт окт 15, 2010 23:27:45
БАТАРЕЙКУС
поготь я так понял тебе нужна задержка в 5 милисек.
если да то напиши её в асемблере раз на компиляторе неполучается в Си коде.
http://ikarab.narod.ru/Delay.html

Re: вертикально перемещающаяся платформа на PIC16F876

Добавлено: Сб окт 16, 2010 10:20:06
Meteor
Небольшое замечание. Рассмотрел алгоритм и не нашел, равно как в описании, датчиков крайних положений. Это не есть хорошо ибо ошибка в работе алгоритма (помеха например) приведет к тому что или поедет нетуда или вообще "зашибет". Делал аналогичную систему, лет так 7 назад (двухкоординатный измеритель, ШД привод, длина 5 м), так там пришлось выделять 3 зоны с различными режимами.

Re: вертикально перемещающаяся платформа на PIC16F876

Добавлено: Вс окт 17, 2010 12:08:37
twise
ну да про датчики я чтото лоханулся....но тем не менее как можно реализовать эту гребанную задержку....про 5мс это я так образно это типа минимальной задержки исходя из 20мгц ...я пробовал делеем и я не говорю что это не работает, но хотелось бы чего то другого например еще одного условия ...цикла да чего угодно, потому что использовать делей как намекнул один из моих товарищей " ...как то не очень..."

Re: вертикально перемещающаяся платформа на PIC16F876

Добавлено: Вс окт 17, 2010 12:10:52
twise
БАТАРЕЙКУС писал(а):поготь я так понял тебе нужна задержка в 5 милисек.
если да то напиши её в асемблере раз на компиляторе неполучается в Си коде.
http://ikarab.narod.ru/Delay.html
за программку спасибо огромное