Skocz do zawartości

Jak zmienić działanie sterownika TTL


qulet

Pomocna odpowiedź

Witam !

Moj sterownik diody TTL teraz dzała tak:

0V=ON moc MAX

5V=OFF moc MIN

Jak mogę to zmienić na przeciwne dziłanie?

Proszę o pomoc w formie schematu.

Dziekuję z góry za okazaną pomoc !!!!

Link do komentarza
Share on other sites

To jest komplet laser + sterownik schematu niestety nie mam:(((

Jak zrobić poprawkę w kodzie aby na PIN9_PWM był stan wysoki ?

*
 DigitalRead Step/Dir to PWM by TobyTetzi 2017
*/

//Defines
#define laser_PWM OCR1A // Timer1 OCR1A Compare Register für Laser PWM
#define STEP_IN 2 // Step Pin Eingang, liegt auf Arduino Pin 2, Externer Interupt 1
#define DIR_IN 3 // Dir Pin Eingang, liegt auf Arduino Pin 3
#define PWM_OUT 9 // PWM Pin Ausgang , liegt auf Arduino Pin 9

//#define DEBUG 1

//Init
int Steps = 0; // Zähler für Steps
const int PWM_max = 255; // Maximaler PWM Wert, 255 für 8 Bit, 1023 für 10 Bit, 4095 für 12 Bit 

#ifdef DEBUG
int StepsOld = 0; // Alte Steps für Serielle Ausgabe
#endif

//Setup
void setup() {
#ifdef DEBUG
//Serielle Schnittstelle zum Testen der Steps und Dir
Serial.begin(115200);
Serial.print("Steps/Dir to PWM by TobyTetzi");
Serial.print('\n');
#endif

//OCR1A = 25;
pinMode(PWM_OUT,OUTPUT); // Set output mode for PWM pin
pinMode(STEP_IN, INPUT_PULLUP);
attachInterrupt(STEP_IN -2, IRQ1, RISING);

pinMode(DIR_IN,INPUT_PULLUP);

TCCR1A = (1 << COM1A1) | (1 << WGM11); // Enable Fast PWM on OC1A (Pin 9)
//TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // Mode 14 Fast PWM/ (TOP = ICR1), pre-scale = 1
TCCR1B = (1 << WGM13) | (1 << CS11); // Mode 10 Phase Correct PWM/ (TOP = ICR1), pre-scale = 8
ICR1 = PWM_max;// Set the TOP value for PWM
laser_PWM = 0; //Set the PWM output to full off.
}

void loop() {
// put your main code here, to run repeatedly:
   if (Steps < 0) { Steps = 0; }
   if (Steps > PWM_max) { Steps = PWM_max; }
   laser_PWM = Steps;

   #ifdef DEBUG
   if (StepsOld != Steps) {

   StepsOld = Steps;

   //Serial.print("DirState: ");
   //Serial.println(DirState);

   Serial.print("Steps: ");
   Serial.println(Steps);

   }
   #endif
}

void IRQ1()
{
if (!digitalRead(DIR_IN)) { Steps--; }
if (digitalRead(DIR_IN)) { Steps++; }
}
Link do komentarza
Share on other sites

Ale kiedy ma być stan wysoki? Przecież na tym pinie, po krótkim czasie inicjalizacji jest PWM więc raz zero a raz jeden, zmieniające się bardzo szybko. Tak więc pisz precyzyjniej, bo odwrócenie działania timera na zanegowane wyjście to zmiana jednej linijki kodu, tylko po co?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

qulet, opisz dokładnie co robisz i co się wtedy dzieje, a co byś chciał uzyskać, bo z Twojego opisu ciężko zrozumieć co chciałbyś faktycznie zmienić. Oczywiście możesz "odwrócić sygnał PWM", ale raczej nie tego faktycznie szukasz 😉

Link do komentarza
Share on other sites

Teraz po wgraniu tego kodu do arduino, podłłączeniu sterownika lasera i sygnałów stp i dir do arduino , dioda lasera świeci ma MAX. W Mach_u nie zdąże odpalić programu NC a już mam wypaloną dziurę w materiale na którym chcę grawerować. 🙁(( Na kodowaniu niestety nieznam się... Umię połączyć elektronikę w/ schematu. Podłączam również ten sterownik lasera do GRBL .

Tam jest tak że przy inicjalizacji dioda się załącza na chwilę a następnie gaśnie.. czyli mechaniczne odcięcie zasilania sterownika na chwilę inicjalizacji grbl na arduino rozwiązuje problem.

Link do komentarza
Share on other sites

Dobra, już rozumiemy.

No to tak: w tym programie kaszan jest wiele. Przede wszystkim autor nie ma pojęcia o zagrożeniach związanych z jednoczesnym dostępem kilku procesów do zasobów, w tym przypadku do zmiennej 16-bitowej. W przerwaniu ją zlicza a w pętli głównej testuje i także modyfikuje. Skutki mogą być opłakane. Nie wnikając w szczegóły i zmieniając jak najmniej, ja bym to zrobił jakoś tak:

//Defines
#define laser_PWM OCR1A // Timer1 OCR1A Compare Register für Laser PWM
#define STEP_IN 2 // Step Pin Eingang, liegt auf Arduino Pin 2, Externer Interupt 1
#define DIR_IN 3 // Dir Pin Eingang, liegt auf Arduino Pin 3
#define PWM_OUT 9 // PWM Pin Ausgang , liegt auf Arduino Pin 9

//Init
uint8_t Steps;
const uint8_t PWM_max = 255; // Maximaler PWM

//Setup
void setup() {

   pinMode(PWM_OUT,OUTPUT); // Set output mode for PWM pin
   digitalWrite(PWM_OUT, 1);

   pinMode(STEP_IN, INPUT_PULLUP);
   pinMode(DIR_IN,INPUT_PULLUP);

   laser_PWM = Steps = PWM_max; //Set the (inverted) PWM output to full off.

   attachInterrupt(STEP_IN -2, IRQ1, RISING);

   ICR1 = PWM_max;// Set the TOP value for PWM
   TCCR1A = (1 << COM1A1) | (1 << WGM11); // Enable Fast PWM on OC1A (Pin 9)
   TCCR1B = (1 << WGM13) | (1 << CS11); // Mode 10 Phase Correct PWM/ (TOP = ICR1), pre-scale = 8
}

void loop() {
   Serial.print("Laser Power: ");
   Serial.println(PWM_max - Steps);
   delay(1000); // :)
}

void IRQ1() {
if (digitalRead(DIR_IN)) {
   if (Steps < PWM_max)
       Steps++; }
else {
   if (Steps > 0)
       Steps--; }
laser_PWM = Steps;
}

Kodu nie testowałem, piszę na kolanie w firmie. Na pewno wszyscy zainteresowani znajdą wszelkie babole i w końcu zacznie działać 🙂

Pamiętaj jednak, że Arduino potrzebuje chwili na start. Mimo iż program od razu wysyła na pin stan wysoki, minie trochę czasu zanim dioda się wyłączy. Ja bym podciągnął pin D9 Arduino do plusa przez opornik 10k. To powinno zapewnić domyślne wyłączenie lasera zanim jeszcze wstanie procesor i zrobi to celowo.

Program startuje teraz od maksymalnej wartości PWM i to jest min. moc lasera. Żeby ją zwiększyć musisz podawać impulsy STEP przy DIR_IN = 0.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

marek 1707

Bardzo dziękuję ! za poprawienie kodu jutro go przetestuję Moja płytka sterująca Machem to USB MOTION CARD STB4100. Taktuje sygnałem 100Khz. Czy ta częstotliwość może tak zostać?

Czy muszę ją zmniejszyć do 25Khz ? (to jest standard w Mach3).

Pozdrawiam!

[ Dodano: 09-05-2018, 14:44 ]

Poprawiony program wgrałem do arduino...

Niestety sygnały STP i DIR Low active nie generują PWM Na oscyloskopie DSO 138 nie ma żadnego przebiegu. Na pinie 9 jest +5V

Na Low de active ta sama sytuacja.

Przed poprawką kodu na starcie generował się PWN z wypełnieniem ok16% wypełnienie zmieniało się po zmianie wartości osi "A" może poprawka powinna tylko zmniejszyć to wypełnienie np do 1%.....

Chyba się poddam. Z programu Mach3 nie ptrafię wykonać graweru w odcieniach szarości. Kod poprawiony ani ten wcześniejszy z mojego postu :

https://www.forbot.pl/forum/topics45/sterowanie-moca-lasera-ttl-na-podstawie-sygnalu-dir-i-stp-wirtualna-os-z-vt15420.htm#125993

nie chcą działać🙁((( nie potrafię tego ogarnąć .

Dziękuję jeszcze raz za okazaną pomoc. Intencje były dobre, a że się nie udało ....

Link do komentarza
Share on other sites

Przestań jęczeć i nie załamuj rąk. Rozumiem, że jesteś w trudnej sytuacji bo musisz zrobić coś czego działania nie rozumiesz, to frustrujące, przyznaję. Wiedz, że programy to skomplikowane konstrukcje i praktycznie nigdy nie działają od razu. Tak jak wspomniałem ten nie był sprawdzony, chodziło mi bardziej o ideę korzystania ze zmiennej i przy okazji odwrócenie wypełnienia startowego. Dziś wieczorem (chyba że ktoś zrobi to szybciej) wrzucę go na jakąś płyteczkę i popatrzę, przecież to nie może być nic wielkiego.

Czy Twoje Arduino to 5V/16MHz?

Link do komentarza
Share on other sites

Dzięki z wsparcie!

Arduino to duemilanove.

Bardziej rozbudowany projekt tego sterowania jest w mojm poście :

https://www.forbot.pl/forum/topics45/sterowanie-moca-lasera-ttl-na-podstawie-sygnalu-dir-i-stp-wirtualna-os-z-vt15420.htm#125993

Tam jest wyswietlacz i z przycisków przynajmniej działa PWN nie bardzo chce działać sterowanie mocą diody z zapuszczonego programu w Mach3 . Efekt jest taki że dioda świeci z różną mocą ale wypalany obrazek jest do "bani"

Na sterowaniu z LaserGRBL efekt jest super to jest próbka:

Pewnie nasuwa się pytanie po co ta walka z Mach3 ?

Ten obrazek zrobiony był na drukarce 3D pole robocze 200x200.

Mam jeszcze router CNC własnej roboty pole robocze 400x500 i tam sterowanie maszyny jest pod MACH3.

Link do komentarza
Share on other sites

No tak, program, jest generalnie OK, tylko pętla główna zwisa przy próbie wypisania czegoś przez UART 😐 Wywaliłem z setup() inicjalizację portu szeregowego a potem coś próbuję pisać więc nie działa. Wstaw jedną albo dwie linie gdzieś po ustawianiu kierunku portów:

    Serial.begin(115200); 
   Serial.print("A kuku!"); 

Obecna częstotliwość PWM to 3.9kHz, więc chyba jak dla Ciebie to mało. Możesz ją podciągnąć 8 razy przez proste przestawienie prescalera timera. Wstaw (zamiast obecnej linii) to:

    TCCR1B = (1 << WGM13) | (1 << CS10); // Mode 10 Phase Correct PWM/ (TOP = ICR1), pre-scale = 1

Ponieważ zupełnie nie jest tu potrzebny tryb "Phase/frequency correct" to w łatwy sposób można to zwiększyć dalsze dwa razy przez wybranie trybu 14 (Fast PWM / ICR1) zamiast obecnego, najbardziej wypasionego 8. Tak więc na maxa, bez spadku rozdzielczości poniżej 8 bitów możesz dostać 62.5kHz.

-------------------------

EDIT: Mimo wszystko nawet bez tej poprawki z inicjalizacją Serial'a i tak timer i przerwania działają więc pierwsze narastające zbocze na pinie 2 przy stanie niskim na pinie 3 zaczyna produkować PWM, na starcie wyłączony do tanu wysokiego. Kolejne zbocza na pinie 2 zwiększają wypełnienie a gdy dasz pin3=1, zmniejszają. Oczywiście mówimy o wypełnieniu "odwrotnym", gdzie stan 0 jest aktywny i włącza laser a stała jedynka na wyjściu to 0% mocy. Hm, u mnie to działa..

  • Lubię! 1
Link do komentarza
Share on other sites

marek1707

Bądź tak dobry i jeszcze raz podeśli mi CAŁY poprawiony kod.

Laserowy TTL działa na 20 kHz więc to PWM 62,5 kHz chyba nie do końca się sprawdzi.....

Wiesz ja tej "Magicznej" umiejętości kodowania nie posiadam... A jestem już trochę za stary na przyswajanie nowej wiedzy (rocznik 1956)

Jak dostane cały szkic, w tedy go wgram do arduino i sprawdzę jak działa.

Jeszcze raz dziękuję za pomoc i poświęcony czas!

Pozdrawiam !

Link do komentarza
Share on other sites

Proszę, przeklej do swojego Arduino, kompiluj, wgraj i napisz jak działa:

//Defines 
#define laser_PWM OCR1A // Timer1 OCR1A Compare Register für Laser PWM 
#define STEP_IN 2 // Step Pin Eingang, liegt auf Arduino Pin 2, Externer Interupt 1 
#define DIR_IN 3 // Dir Pin Eingang, liegt auf Arduino Pin 3 
#define PWM_OUT 9 // PWM Pin Ausgang , liegt auf Arduino Pin 9 

//Init 
uint8_t Steps; 
const uint8_t PWM_max = 255; // Max PWM 

//Setup 
void setup() { 

   pinMode(PWM_OUT,OUTPUT);        // Set output mode for PWM pin 
   digitalWrite(PWM_OUT, 1); 

   pinMode(STEP_IN, INPUT_PULLUP); 
   pinMode(DIR_IN,INPUT_PULLUP);

   Serial.begin(115200); 
   Serial.println("A kuku!"); 

   laser_PWM = Steps = PWM_max;    //Set the (inverted) PWM output to full off. 

   attachInterrupt(digitalPinToInterrupt(STEP_IN), Step_ISR, RISING); 

   ICR1 = PWM_max;                                       // Set the TOP value for PWM 
   TCCR1A = (1 << COM1A1) | (1 << WGM11);                // Enable Fast PWM on OC1A (Pin 9) 
   TCCR1B = (1 << WGM13) | (1 << WGM12) |(1 << CS11);    // Mode 14: Fast PWM (TOP = ICR1), pre-scale = 8 
} 

void loop() { 
   Serial.print("Laser Power: "); 
   Serial.println(PWM_max - Steps); 
   delay(1000); // :) 
} 

void Step_ISR() { 
if (digitalRead(DIR_IN)) { 
   if (Steps < PWM_max) 
       Steps++; } 
else { 
   if (Steps > 0) 
       Steps--; } 
laser_PWM = Steps; 
} 

To wersja dająca: 16MHz / 8 / 256 → 7.8kHz PWM. Dokładne 20kHz będzie możliwe do uzyskania kosztem zmiany rozdzielczości. Teraz masz wciąż te same co w oryginale 256 poziomów mocy lasera. Jak szybkie mogą być impulsy STEP w "osi" modulacji mocy?

  • Lubię! 1
Link do komentarza
Share on other sites

marek 1707

Ja jestem "DURNY CIUL" zasugerowałem się tym że jak niema podanego napięcia na pin TTL w sterowniku lasera to laser świeci na MAX. To jest PRAWDA !

Ale w momencie kiedy podłączony jest sygnał PWN NA TTL lasera to:

Przy wypełnieniu 0 % laser nie świeci (pomiar napięcia DC miernikiem 0V)

Przy wypełnienieniu 50% laser świeci z połową mocy (pomiar napięcia DC miernikiem 2,5V)

Przy wypełnieniu 100 % laser świeci na maxa (pomiar napięcia DC miernikiem 4,9V)

To sprawdzenie było przy częstotliwości PWN= 31KHz sygnał był podawany z arduino z kodem jak na fotce powyżej.

Wracając do Twojego poprawionego szkicu na oscyloskopie widać że sygnał STP zmienia wypełnienie PWN . To już jest połowa sukcesu. Potrzeba zmienić to działanie modulacji na takie jak opisałem, by dioda od razu nie świeciła na maxa.

Widać już światełko w tunelu.

Jeszcze raz PRZEPRASZAM za moją głupotę, liczę że następna wersja poprawionego kodu będzie "OK" Dziękuję za poświęcony czas na rozwiązanie mojego problemu.

Link do komentarza
Share on other sites

Zdarza się. Poniższy kod startuje od czystego zera na pinie wyjściowym i generuje PWM o częstotliwości ok. 7.8kHz:

//Defines 
#define laser_PWM OCR1A // Timer1 OCR1A Compare Register für Laser PWM 
#define STEP_IN 2 // Step Pin Eingang, liegt auf Arduino Pin 2, Externer Interupt 1 
#define DIR_IN 3 // Dir Pin Eingang, liegt auf Arduino Pin 3 
#define PWM_OUT 9 // PWM Pin Ausgang , liegt auf Arduino Pin 9 

uint8_t Steps; 
const uint8_t PWM_max = 255; // Max PWM 

void setup() { 

   digitalWrite(PWM_OUT, 0);       // Clear PWM pin just at the beginning
   pinMode(PWM_OUT, OUTPUT);        // Set the output mode for this pin 

   pinMode(STEP_IN, INPUT_PULLUP); 
   pinMode(DIR_IN, INPUT_PULLUP); 

   Serial.begin(115200); 
   Serial.println("A kuku!"); 

   laser_PWM = Steps = PWM_max;          //Set the PWM output level to zero

   attachInterrupt(digitalPinToInterrupt(STEP_IN), Step_ISR, RISING); 

   ICR1 = PWM_max;                                           // Set the TOP value for PWM 
   TCCR1A = (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11);    // Enable Fast, hardware inverted PWM on OC1A (Pin 9) 
   TCCR1B = (1 << WGM13) | (1 << WGM12) |(1 << CS11);        // Mode 14: Fast PWM (TOP = ICR1), pre-scale = 8 
} 

void loop() { 
   Serial.print("Laser Power: "); 
   Serial.println(PWM_max - Steps); 
   delay(1000); // :) 
} 

void Step_ISR() { 
 if (digitalRead(DIR_IN)) {
     if (Steps < PWM_max) 
         Steps++; } 
 else { 
     if (Steps > 0) 
         Steps--; } 
 laser_PWM = Steps; 
} 

PWM jest zwiększany gdy narastające zbocze STEP przyjdzie podczas DIR=0.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.