Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
Nie rozumiem w czym masz problem?? Przecież silnik się kręci a wyświetlacz wyświetla..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 10
Liczba wątków: 2
Dołączył: Dec 2021
Reputacja:
0
Z tym, że chciałbym zrównoleglić program, bo wyświetlacz wyświetla ale po zakończeniu obrotu silnika. Są to małe odstępy czasu ale projekt wymaga tego, żeby działo się to równolegle. Udalo mi sie zastąpic funkcję delay() funkcjami micros(); ale wtedy jest problem z wyświetlaniem, posługiwałem się takim fragmentem kodu, czego funkcję while platają mi figlę a gdy wstawie coś w ich ciało silnik ogranicza prędkość obrotów
void loop() {
for (int s = 0; s < steps; s++){
time_a = micros();
digitalWrite(7, HIGH);
digitalWrite(7, LOW);
while(micros() - time_a < 3000){
}
time_b = micros();
digitalWrite(7, LOW);
while(micros() - time_b < 2000){
// do nothing
}
}
while(1);
}
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
03-01-2022, 07:24
(Ten post był ostatnio modyfikowany: 03-01-2022, 08:00 przez Jarewa0606.)
a czemu nie zrobisz tego na timerze? już nie mówię sprzętowe PWM ale niech choć macha pinem na przerwaniu. Jakie to ardunio jaka atmega??
Przykład dla atmegi 2560 i 328p
Kod:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "HX711.h"
#define DOUT 3 //pin do którego podłączone jest złącze DT
#define CLK 2 //pin do którego podłączone jest złącze SCK
HX711 scale(DOUT, CLK);
float calibration_factor = -860.0; //korekta pomiarowa
LiquidCrystal_I2C lcd(0x27,16,4); //określenie adresu wyświetlacza i jego wielkość
#define StepPin 7
ISR(TIMER1_COMPA_vect) {
digitalWrite(StepPin, digitalRead(StepPin) ^ 1);
}
void setup() {
pinMode(8,OUTPUT); //krokowy DIR
pinMode(StepPin,OUTPUT); //krokowy STEP
pinMode(6,OUTPUT); //krokowy EN
digitalWrite(8,HIGH);
digitalWrite(6,LOW);
//////////////// Timer 2,5ms 400Hz bo taki miałeś delay 5ms dwie zmiany, zmiana co 2,5ms
noInterrupts();
// Clear registers
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 624; // 400 Hz (16000000/((624+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
///////////////
lcd.init(); //uruchamiamy wyświetlacz
lcd.backlight(); //uruchamiamy podświetlenie wyświetlacza
scale.set_scale(calibration_factor); //Ustawienie kalibracji
scale.tare();
}
void loop() {
lcd.clear();//wyczyszczenie wyświetlacza
lcd.setCursor(0,0);//ustawienie kursora
lcd.print("Sila adhezji=");
lcd.setCursor(0,1);
scale.set_scale(calibration_factor); //Zastosowanie korekty pomiarowej
Serial.print("Odczyt: ");
Serial.print(scale.get_units(), 1); //scale.get_units() zwraca zmienną float
Serial.print(" N"); //Dowolnie możemy wybrać kilogramy lub funty, lecz przy zmianie zmienia się również współczynnik kalibracji
Serial.println();
lcd.print(scale.get_units(), 1);
lcd.setCursor(4,1);
lcd.print("N");
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 10
Liczba wątków: 2
Dołączył: Dec 2021
Reputacja:
0
Jest to arduino uno r3, na timerze to znaczy?
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
03-01-2022, 17:21
(Ten post był ostatnio modyfikowany: 04-01-2022, 00:16 przez Jarewa0606.)
To wyżej będzie działać... Timer to znaczy sprzętowe przerywanie. I to wyżej macha pinem na przerwaniu, wiec silnik działa niezależnie od programu wyświetlacza nawet gdybyś wstawił jakieś tam "delay" to silnik będzie kręcił po prostu czasami blokuje wyświetlacz (ale to dosłownie z 10 taktów zegara) by wykonała sie zmiana na pinie gdzie tego nawet nie zauważysz...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 10
Liczba wątków: 2
Dołączył: Dec 2021
Reputacja:
0
04-01-2022, 15:43
(Ten post był ostatnio modyfikowany: 04-01-2022, 15:50 przez lightzone.)
Bardzo dziękuje,jestem mega wdzięczny, jedynym mankamentem było to , to że na wyświetlacz odświeża sie z bardzo duża częstotliowścią i nie wczytuje wartości funkcji : scale.get_units(). Po usunięciu lcd.clear, już tą wartość udało się uzyskać, jeszcze jedno pytanie, jak zwolnić nadpisywanie wartości siły adhezji na wyświetlaczu? Rozumiem, że odbywa się w to w tym fragmencie kodu:
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 624; // 400 Hz (16000000/((624+1)*64))
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
Nie tutaj
lcd.setCursor(0,0);//ustawienie kursora
lcd.print("Sila adhezji=");
Po prostu daj delaya. Albo millis jak umiesz...
Teraz twój problem polega na tym że LCD dostał kopa i nic go nie blokuje... Dlatego wyświetlacz szwankuje bo dane są bardzo szybko aktualizowane. A wcześniej niż zdążyło się wyświetlić to nastąpiło czyszczenie lcd..
po drugie ja tego nie rozumiem skoro to jest miernik jakiejś siły oderwania/przerwania to nie lepiej liczyć kroki odległości? i najwyższy Nm??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.