Forum PCLab.pl: problem w programie Arduino - Forum PCLab.pl

Skocz do zawartości

Otwarty

Ikona Ostatnio dodane tematy

Ikona Najnowsze pliki

Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

problem w programie Arduino Oceń temat: -----

#1 Użytkownik jest niedostępny   sewek10 

  • Małomówny
  • Pip
  • Grupa: Forumowicze
  • Postów: 4
  • Dołączył: So, 25 Maj 13

Napisany 15 Listopad 2019 - 22:01

Witam, robię sobie projekt, jest to moduł mechanicznej modulacji światła na arduino, steruję wentylatorem 4 pinowym za pomocą pwm zmienionego na 30kHz, do tego mam czujnik szczelinowy który zlicza prędkość, potencjometry do regulacji wypełnienia PWM oraz lcd który pokazuje aktualna prędkość. Problem polega na tym, że wszystko ładnie działa, ale tylko wtedy kiedy pwm jest 100%. Pokazuje wtedy prędkosc 2200 rpm a jak zahamuje wentylator palcem to stopniowo maleje. Gdy zmniejsze wypełnienie pozniej 100% to nagle skacze z 2200 na 3800 a nastepnie stopniowo spada wraz ze mniejszaniem wypełnienia, jednak te wartosci skacza w zakresie 100rpm wiec to i tak jakies bzdury. Dodam, że jak ustawie wartosc PWM na sztywno to dzieje się to samo. Juz nie wiem co to moze byc, Timer 1 zlicza predkosc a timer 2 przestawia PWM na 30kHz. Prosze o pomoc

#include <LiquidCrystal_I2C.h>
#include "TimerOne.h"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
const byte SpeedSensor = 2;
volatile unsigned int counter = 0;
volatile unsigned int counterStan = 0;
float diskslots = 6;
float Speed = 0;

int timeToWait = 1000; //Czas, który ma czekać
int setTime=0;               
int aktualTime=0;
int done;

int odczytanaWartosc = 0;
void ISR_count()
{
  counter++;
}

void ISR_timerone()
{
  Timer1.detachInterrupt();
  counterStan = counter;
  Speed = (counter / diskslots) * 60.00;
  counter = 0;
  Timer1.attachInterrupt( ISR_timerone );
}
void setup() {

   TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
    pinMode(3, OUTPUT); // Sets the pin as output
  
  Timer1.initialize(1000000);
  attachInterrupt(digitalPinToInterrupt (2), ISR_count, RISING);
  Timer1.attachInterrupt( ISR_timerone);
  
  lcd.init();
  lcd.backlight(); 
  
}

void loop() {
 
 lcd.clear();
  
  setTime = millis();
  done=1; 
  while(done){  //Wykonuje się tak długo aż upłynie 1s i wykona się reszta kodu
    aktualTime = millis();
    if (aktualTime < setTime+timeToWait){
  lcd.setCursor(0,0);
  lcd.print("Frequence: ");
  lcd.print(counterStan);
  lcd.setCursor(0,1);
  lcd.print("RPM: ");
  lcd.print(Speed);
}
else
  {   
    odczytanaWartosc = analogRead(A3);
    analogWrite( 3,(odczytanaWartosc/4));
    done=0;
    }
}
}


Dodaj obrazek

#2 Użytkownik jest niedostępny   Bono[UG] 

  • Wiecznie niewyspany...
  • PipPipPipPipPip
  • Grupa: Forumowicze
  • Postów: 20226
  • Dołączył: Pt, 27 Wrz 02

Napisany 18 Listopad 2019 - 12:46

Czy counterStan dobrze wyświetla, czy też jest przekłamanie?

Nie znam się na Arduino i innych sprzętowych sprawach ale może coś z zegarem jest nie tak i przy zmniejszaniu wypełniania np. zaczyna wolniej chodzić? :hmm:

#3 Użytkownik jest niedostępny   mkopek 

  • Dyskutant
  • PipPip
  • Grupa: Forumowicze
  • Postów: 13
  • Dołączył: Wt, 28 Wrz 10

Napisany 19 Listopad 2019 - 16:26

Ja bym zaczal od dania Speed jako volatile, bo w petli sie ono nigdzie nie zmienia i kompilator nie ma powodu odczytywac Speed z RAMu. Albo jeszcze lepiej, przenies obliczanie Speed do loop(). Zastanawiam sie po co przestawiales PWM na 30 kHz? Czy standardowe 490 HZ nie bylo by OK? Tak jak pytał przedmowca jakie wartosci counterStan pokazuje? Sprawdziles czy LiquidCrystal_I2C nie uzywa Timer2, ewentualnei jakos w niego ingeruje? Lub w timer1, uzywany przez twoje przerwanie? Sprawdzales jak sie zmienia napiecie na silniku wraz ze zmiana ustawien? Czy przy większej predkosci kartonik nie odkształca się tak, ze sensor nie lapie wszystkich otworow? Skoro to wentylaor 4 pin, to nie ma on wbudowanego sensora obrotow?
Edytka:
Jeszcze zmien aktualTime i setTime na long unsigned, mozesz tez dla pewnosci timeToWait zmienić, bo nie wiem jak kompilator skonwertuje sume tych dwoch. Oczywiscie wiesz, ze nadal bedziesz mial przepelnienie po 50 dniach i przez sekunde petla while nie podziala prawidlowo (dwrotnie zadziala warunek if).

Ten post był edytowany przez mkopek dnia: 19 Listopad 2019 - 16:53


Strona 1 z 1
  • Nie możesz rozpocząć nowego tematu
  • Nie możesz odpowiadać w tym temacie

1 Użytkowników czyta ten temat
0 użytkowników, 1 gości, 0 anonimowych