Отговори на тема  [ 13 мнения ] 
cnc 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 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 че не написах коментарчетата забравих ги


Последна промяна spas92 на Сря Яну 14, 2009 7:05 pm, променена общо 1 път



Сря Яну 14, 2009 5:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Ми то хубаво, ама от програмата ти не става ясно кой пин за какво :oops: Сложи някой коментар, че да можем да се ориентираме. Я си представи, че това не е твоя програма и сядаш да я погледнеш, какво би разбрал ?

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Яну 14, 2009 5:56 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Аз нищо не разбрах, за другите не знам как е :wink: Ако вземеш да го напишеш по-четливо, може дори и да разбереш къде е проблема ;) Помисли си : този код ако го четеш няколко години по-късно....


Сря Яну 14, 2009 6:42 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
всичко опира до това
зада се заравти двигателя на порт В се подава това:

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

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

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

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


Сря Яну 14, 2009 9:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Яну 14, 2009 10:09 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
на пиновете подавам "+" с едно съпротивление от 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 сек реагира :? :? :?


Чет Яну 15, 2009 12:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Ти симулатор нямаш ли си?


Чет Яну 15, 2009 1:03 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
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 ) нищо не значи.

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Яну 15, 2009 1:14 am
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
Тъй ...
Аз предлагам по-лесен начин да си направиш драйвера:
Един регистър, който зареждаш със стойност 10001000. Като постъпи фронт на пина за стъпка, правиш проверка на състоянието на пина за обръщане и според неговото състояние правиш побитово завъртане на този регистър наляво или надясно. След това побитово пренасяш десните четири или левите четири бита към изходния порт.
Хубавото тук е, че лесно можеш да преобразуваш от пълностъпково към полустъпково управление - тогава зареждаш регистъра със стойност 00000111 и пренасяш всеки нечетен бит към изходния порт.
Съветвам да добавиш някакъв таймер, който да се нулира при всяко постъпване на импулс за стъпка и когато изтече да изключва тока към двигателя, защото така направен драйвер ако го използваш за някой по-мощен двигател, ще получиш фурна. Аз примерно го настройвам на около половин секунда.

_________________
Digitally yours: Optron


Чет Яну 15, 2009 11:47 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
if(v==1&&t==1)

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

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


Чет Яну 15, 2009 2:24 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Виж си нивата на пиновете... дали са такива, каквито очакваш :) НЕ съм сигурен, пиновете на този PIC дали не бяха с TTL драйвери. Ако е така, трябва да подаваш 0 вместо 1


Чет Яну 15, 2009 3:26 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Дек 08, 2008 11:37 pm
Мнения: 59
Мнение 
мн благодаря на вс който помогнаха
накрая го накарах да работи както трябва
ето това е краиният код
//следи кога на пина се появява 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);

}


Последна промяна spas92 на Съб Яну 17, 2009 4:24 pm, променена общо 1 път



Чет Яну 15, 2009 5:40 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
...v = input (42)

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


Пет Яну 16, 2009 2:36 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни