14-06-2024, 10:38
Ja mam arduino uno i nie bardzo wiem czym jest uc to podam symbol jaki mam na mikrokontrolerze ATMEL MEGA328P AU1519
Ocena wątku:
Licznik obrotów czujnik halla
|
(14-06-2024, 10:38)poziomka97 napisał(a): Ja mam arduino uno i nie bardzo wiem czym jest uc to podam symbol jaki mam na mikrokontrolerze ATMEL MEGA328P AU1519
#define pinICP 8 //
#define ICP_Timers 40000 // Przepelnienie licznika Timer1 co 20ms
#define LICZBAPROBEK_ICP_Okres 10
///////////// Timer 1 Input Capture sygnal pin 8
volatile uint32_t ICP_Okres =0;
volatile uint32_t Suma_ICP_Okres = 0;
volatile uint8_t ICP_Tik_Okres =0;
volatile uint32_t Srednia_ICP_Okres =0;
volatile uint16_t ICP_Tim_Okres =0;
volatile uint8_t ICP_Timers_Okres =0;
volatile uint16_t Ostatni_ICP_Tim_Okres =0;
volatile bool ICP_bool_Okres = false;
ISR(TIMER1_COMPA_vect) { //////////// przepelnienie licznika co 20ms
ICP_Timers_Okres++;
if(ICP_Timers_Okres >100){ // time out 2s
Srednia_ICP_Okres =0;
ICP_Okres=0;
ICP_bool_Okres=true;
}
}
ISR(TIMER1_CAPT_vect) { // przerwanie input capture
ICP_Tim_Okres = TCNT1; // odczytaj aktualny stan licznika
if(ICP_Timers_Okres >0){
if(ICP_Timers_Okres >1){
Ostatni_ICP_Tim_Okres = ICP_Timers - Ostatni_ICP_Tim_Okres;
ICP_Okres = (((ICP_Timers_Okres-1)*ICP_Timers)+Ostatni_ICP_Tim_Okres+ICP_Tim_Okres)>>1;
}else{
Ostatni_ICP_Tim_Okres = ICP_Timers - Ostatni_ICP_Tim_Okres;
ICP_Okres = (Ostatni_ICP_Tim_Okres+ICP_Tim_Okres)>>1;
}
}else{
ICP_Okres=(ICP_Tim_Okres-Ostatni_ICP_Tim_Okres)>>1;
}
Ostatni_ICP_Tim_Okres=ICP_Tim_Okres;
ICP_Timers_Okres=0;
//////////////// wyliczanie sredniej Okres
Suma_ICP_Okres=Suma_ICP_Okres+ICP_Okres;
ICP_Tik_Okres++;
if(ICP_Tik_Okres>=LICZBAPROBEK_ICP_Okres){
Srednia_ICP_Okres=(Suma_ICP_Okres/ICP_Tik_Okres);
ICP_Tik_Okres=0;
Suma_ICP_Okres=0;
ICP_bool_Okres=true;
}
}
void setup() {
Serial.begin(9600);
pinMode(pinICP, INPUT);
cli();
TCCR1A = 0;
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<CS11) | (1<<WGM12) ;
TCCR1C = 0;
OCR1A = (ICP_Timers-1);
TIFR1 = (1<<ICF1) | (1<<TOV1);
TIMSK1 = (1<<ICIE1) | (1 << OCIE1A);
{ TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); } /// L/H
//{ TCCR1B &= ~(1<<ICES1); TIFR1 |= (1<<ICF1); } // H/L
sei();
}
void loop() {
if(ICP_bool_Okres){
Serial.println( "OKRES");
Serial.println( ICP_Okres);
Serial.println( "SREDNIA OKRESU");
Serial.println(Srednia_ICP_Okres);
Serial.println( "CZESTOTLIWOSC");
Serial.println( 1000/ICP_Okres);
Serial.println( "SREDNIA CZESTOTLIWOSCI");
Serial.println( 1000/Srednia_ICP_Okres);
ICP_bool_Okres=false;
}
}