Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

cnc
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6457
Страница 1 от 1

Автор:  spas92 [ Сря Яну 14, 2009 5:43 pm ]
Заглавие:  cnc

zd

през лятото бях решил да направя една малка cnc фреза
преди години с баща ми направихме една но тя работи по съвсем различен начин
скоро започнах да се занимавам с микроконтролери и реших да си направя драйвер за стъпков двигател с pic16f84a
написах програмата тествах я на протеус - всичко е ОК но като я пробвах на един контролер изкочи проблем
// за драйвер на CNC се ползват 2 пина - един за стъпка един за обръщане

като дам "1" на пина за стъпка се забавя 5-6 сек и тогава продължава

вече не знам от какво може да се получи това.........

това ми е програмата ако има забележки кажете

Код:
#include <16F84A.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use fast_io (A)
#use fast_io (B)
#use delay(clock=14310000)
#define B_TRIS   0b00000000
#define A_TRIS   0b00011111
void main()
{
int v,t,s;
SET_TRIS_A(0xFF);
SET_TRIS_B(0x00);
v = input (42);//pin за стъпка
t = input (43);//пин за обра6тане
s = 2;
do{
v = input (42);//прожерка на 2та пина
t = input (43);

if(v==1&&t==1)//ако има команда за стъпка и обра6тане-реверс
{
while(v==1)//зацикля докото пина за стъпка стане 0
{
v = input (42);
}

if(s==16){/ s  е променливата която ще контолира двигателя
s=2;
}else{
s=2*s;
}
}

if(v==1&&t==0)//ако има пин за стъпка без обръщане - двигателя прави стъпка обратно
{
while(v==1)
{
v = input (42);
}

if(s==2){
s=16;
}else{
s=s/2;
}
}
output_b(s);//пращане на с към  порт В
} while (1);

}


EDIT:
sory че не написах коментарчетата забравих ги

Автор:  [ Сря Яну 14, 2009 5:56 pm ]
Заглавие: 

Ми то хубаво, ама от програмата ти не става ясно кой пин за какво :oops: Сложи някой коментар, че да можем да се ориентираме. Я си представи, че това не е твоя програма и сядаш да я погледнеш, какво би разбрал ?

Автор:  setoy [ Сря Яну 14, 2009 6:42 pm ]
Заглавие: 

Аз нищо не разбрах, за другите не знам как е :wink: Ако вземеш да го напишеш по-четливо, може дори и да разбереш къде е проблема ;) Помисли си : този код ако го четеш няколко години по-късно....

Автор:  spas92 [ Сря Яну 14, 2009 9:29 pm ]
Заглавие: 

всичко опира до това
зада се заравти двигателя на порт В се подава това:

01000000
00100000
00010000
00001000
01000000
00100000
00010000
00001000
и тн.

при подаване на команда за стъпка проверява дали има 1 или 0 на пина за реверс - обръщане

ако няма от 01000000 ще стане 00100000

ако няма от 01000000 ще стане 00001000

Автор:  [ Сря Яну 14, 2009 10:09 pm ]
Заглавие: 

С какво подаваш сигнал на тези пинове ? Генератор, бутони, с жички ? Ако нямаш стъпка ( v = 0 ) къде ти е кода с който спираш двигателя, няма ли да го повредиш така оставяйки го под напрежение ? Тия функции input кой бит четат или цял порт наведнъж четат ? Вместо 42 и 43 като входни параметри напиши нещо по-разбираемо, примерно #define PORTA нещо си, след това v = input( PORTA + bit_offset ); С една дума, не е добра практика да подаваш като входни параметри на функции някакви числа, по-добре дефинирай с константа параметъра, защото когато пишеш програмата ако объркаш името на константата компилатора ще се обади, но ако сбъркаш числото ще си трае.

Автор:  spas92 [ Чет Яну 15, 2009 12:42 am ]
Заглавие: 

на пиновете подавам "+" с едно съпротивление от 1кОм за да огранича тока
колкото до това че двигателя е постоянно "под напрежение" ми това си е стъпков двигател това му е нормалният режим на работа
колкото до числата то те са си дифинирани още в 16F84A.h

Код:
.....
#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44
.....


друг е проблема че като дам "1" на пина пик-а зацикля и чак след 5-6 сек реагира :? :? :?

Автор:  ji4ka [ Чет Яну 15, 2009 1:03 am ]
Заглавие: 

Ти симулатор нямаш ли си?

Автор:  [ Чет Яну 15, 2009 1:14 am ]
Заглавие: 

spas92 написа:
на пиновете подавам "+" с едно съпротивление от 1кОм за да огранича тока
колкото до това че двигателя е постоянно "под напрежение" ми това си е стъпков двигател това му е нормалният режим на работа
колкото до числата то те са си дифинирани още в 16F84A.h

Код:
.....
#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44
.....


друг е проблема че като дам "1" на пина пик-а зацикля и чак след 5-6 сек реагира :? :? :?


Не съм съгласен с тебе :wink: , нормалния режим на работа на стъпковия двигател е да се въртят фазите ( стъпките ) или да е спрян ( 0V на всяка една фаза ), докато при теб има момент ( когато v стане равно на 0 , а преди това е било 1 ), в който момент на намотките на двигателя ще остане непрекъснато да бъде активна последната фаза ( когато за последно v е било 1 ), или старото ти s. Това няма начин да не повреди драйвера, ако не на момента, то след като прегрее драйвера :-) , а може първо и двигателя да повреди. Въртял съм стъпкови двигатели на печатарки, с други не съм работил, ако ти си намерил някой стъпков двигател, дето може да се остави до безкрай някоя намотка под напрежение, моля сподели опита си :wink:

Проблема с числата е точно обратен на стила на писане, който ти си си харесал :-), точно поради причината, която ти изтъкнах, числата 40,41,42 и т.н. са дефинирани като PIN_A1, PIN_A2 и т.н. Това е с цел да може и други хора ( освен теб ) да могат да разберат за какво иде реч. Примерно ако компилатора не ти беше CCS и така ми дадеш програмата нищичко не бих разбрал, обаче като напишеш input( PIN_A3 ) всеки читател ще вдене, че става дума за PORTA, и то за бит 3, докато input( 43 ) нищо не значи.

А пиновете ( входните ) дефинирал ли си им отвън хардуерно нивата ? Ти подаваш +, а какво става, когато не подаваш този +, пина виси във въздуха или си има резистор, с който си го подпрял към земя ?

Автор:  optron [ Чет Яну 15, 2009 11:47 am ]
Заглавие: 

Тъй ...
Аз предлагам по-лесен начин да си направиш драйвера:
Един регистър, който зареждаш със стойност 10001000. Като постъпи фронт на пина за стъпка, правиш проверка на състоянието на пина за обръщане и според неговото състояние правиш побитово завъртане на този регистър наляво или надясно. След това побитово пренасяш десните четири или левите четири бита към изходния порт.
Хубавото тук е, че лесно можеш да преобразуваш от пълностъпково към полустъпково управление - тогава зареждаш регистъра със стойност 00000111 и пренасяш всеки нечетен бит към изходния порт.
Съветвам да добавиш някакъв таймер, който да се нулира при всяко постъпване на импулс за стъпка и когато изтече да изключва тока към двигателя, защото така направен драйвер ако го използваш за някой по-мощен двигател, ще получиш фурна. Аз примерно го настройвам на около половин секунда.

Автор:  Zeus [ Чет Яну 15, 2009 2:24 pm ]
Заглавие: 

if(v==1&&t==1)

Абе знам, че операциите си имат приоритет на изпълнение, но аз съм свикнал всичко да си заграждам със скоби за по- сигурно
if((v==1)&&(t==1))

Това е просто едно мое мнение :)

Автор:  setoy [ Чет Яну 15, 2009 3:26 pm ]
Заглавие: 

Виж си нивата на пиновете... дали са такива, каквито очакваш :) НЕ съм сигурен, пиновете на този PIC дали не бяха с TTL драйвери. Ако е така, трябва да подаваш 0 вместо 1

Автор:  spas92 [ Чет Яну 15, 2009 5:40 pm ]
Заглавие: 

мн благодаря на вс който помогнаха
накрая го накарах да работи както трябва
ето това е краиният код
//следи кога на пина се появява 0
Код:
#include <16F84A.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use fast_io (A)
#use fast_io (B)
#use delay(clock=14310000)
#define B_TRIS   0b00000000
#define A_TRIS   0b00011111
void main()
{
int v,t,s;
SET_TRIS_A(0xFF);
SET_TRIS_B(0x00);
s=2;
do{
v = input (PIN_A1);//проверка на пиновете за вход
t = input (PIN_A2);
if((v==0)&&(t==0))
{
do{
v = input (PIN_A1);
delay_ms(10);// това забавяне е мн важдо ако го няма прави множество стъпки и не работи както трябва
}while(v==0);

if(s==16){//промяна на s
s=2;
}else{
s=s*2;
}
}

if((v==0)&&(t==1))
{
do{
v = input (PIN_A1);
delay_ms(10);
}while(v==0);           

if(s==2){
s=16;
}else{
s=s/2;
}
}
output_b(s);//пращане на порта
} while (1);

}

Автор:  setoy [ Пет Яну 16, 2009 2:36 pm ]
Заглавие: 

...v = input (42)

Оправи ги тези глупости. Затова са ти ги дали тези дефиниции, за да ги ползваш. input (PIN_A0) е нещо далеч по-разбираемо и преносимо. Представи си, че четеш същия този код след години... има да се чудиш кое какво е и защо е така. Или си представи че прехвърляш същия този код за друг процесор или компилатор... и същия този код е набъбнал до няколко хиляди реда ;) Създавай си полезни навици отсега, докато е време

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/