08-03-2020, 19:45
(Ten post był ostatnio modyfikowany: 08-03-2020, 23:49 przez Jarewa0606.)
Zobacz co wypluje mój testowy kod zamiast do pinu D2 podłącz pin D8
Kod:
#include <Arduino.h>
#define pinICSH 8
#define IC_Timers 40000 // Przepelnienie licznika Timer1 co 20ms
#define LICZBAPROBEK_ICS_PulseH 10
#define LICZBAPROBEK_ICS_Okres 10
///////////// Timer 1 Input Capture sygnal pin 8
volatile uint32_t ICS_Okres =0;
volatile uint32_t Suma_ICS_Okres = 0;
volatile uint8_t ICS_Tik_Okres =0;
volatile uint32_t Srednia_ICS_Okres =0;
volatile uint16_t ICS_Tim_Okres =0;
volatile uint8_t ICS_Timers_Okres =0;
volatile uint16_t Ostatni_ICS_Tim_Okres =0;
volatile uint32_t ICS_PulseH =0;
volatile uint32_t Suma_ICS_PulseH = 0;
volatile uint8_t ICS_Tik_PulseH =0;
volatile uint32_t Srednia_ICS_PulseH =0;
volatile uint16_t ICS_Tim_PulseH =0;
volatile uint8_t ICS_Timers_PulseH =0;
volatile uint16_t Ostatni_ICS_Tim_PulseH =0;
volatile bool ICS_zbocze = false;
volatile bool ICS_bool_PulseH = false;
volatile bool ICS_bool_Okres = false;
ISR(TIMER1_COMPA_vect) { //////////// przepelnienie licznika co 20ms
ICS_Timers_Okres++;
ICS_Timers_PulseH++;
if(ICS_Timers_PulseH >100){ // time out 2s
ICS_Timers_PulseH =0;
ICS_Timers_Okres =0;
Srednia_ICS_PulseH =0;
Srednia_ICS_Okres =0;
{ TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false; } // oczekuj na sygnal L/H
}
}
ISR(TIMER1_CAPT_vect) { // przerwanie input capture
ICS_Tim_PulseH = ICR1; // odczytaj aktualny stan licznika
ICS_Tim_Okres = TCNT1;
if (ICS_zbocze == false) {
TCCR1B &= ~(1<<ICES1);
TIFR1 |= (1<<ICF1);
ICS_zbocze = true; // zmien wyzwolenie na zbocze high-low
Ostatni_ICS_Tim_PulseH=ICS_Tim_PulseH; // zapamiętaj stan licznika początek sygnału HIGH
ICS_Timers_PulseH=0; // wyzeruj przepelnienia licznika
if(ICS_Timers_Okres >0){
if(ICS_Timers_Okres >1){
Ostatni_ICS_Tim_Okres = IC_Timers - Ostatni_ICS_Tim_Okres;
ICS_Okres = (((ICS_Timers_Okres-1)*IC_Timers)+Ostatni_ICS_Tim_Okres+ICS_Tim_Okres)>>1;
}else{
Ostatni_ICS_Tim_Okres = IC_Timers - Ostatni_ICS_Tim_Okres;
ICS_Okres = (Ostatni_ICS_Tim_Okres+ICS_Tim_Okres)>>1;
}
}else{
ICS_Okres=(ICS_Tim_Okres-Ostatni_ICS_Tim_Okres)>>1;
}
Ostatni_ICS_Tim_Okres=ICS_Tim_Okres;
ICS_Timers_Okres=0;
//////////////// wyliczanie sredniej Okres
Suma_ICS_Okres=Suma_ICS_Okres+ICS_Okres;
ICS_Tik_Okres++;
if(ICS_Tik_Okres>=LICZBAPROBEK_ICS_Okres){
Srednia_ICS_Okres=(Suma_ICS_Okres/ICS_Tik_Okres);
ICS_Tik_Okres=0;
Suma_ICS_Okres=0;
ICS_bool_Okres=true;
}
}else {
TCCR1B |= (1<<ICES1);
TIFR1 |= (1<<ICF1);
ICS_zbocze = false; // zmien wyzwolenie na zbocze L/H
if(ICS_Timers_PulseH >0){
if(ICS_Timers_PulseH >1 ){
Ostatni_ICS_Tim_PulseH = IC_Timers -Ostatni_ICS_Tim_PulseH;
ICS_PulseH = (((ICS_Timers_PulseH-1)*IC_Timers)+Ostatni_ICS_Tim_PulseH+ICS_Tim_PulseH)>>1;
}else{
Ostatni_ICS_Tim_PulseH = IC_Timers-Ostatni_ICS_Tim_PulseH;
ICS_PulseH = (Ostatni_ICS_Tim_PulseH+ICS_Tim_PulseH)>>1;
}
}else{
ICS_PulseH = (ICS_Tim_PulseH-Ostatni_ICS_Tim_PulseH)>>1; // ICR1 liczy co 0.5 us 2MHz
}
//////////////// wyliczanie sredniej pulseH 30-100hz sygnal
Suma_ICS_PulseH=Suma_ICS_PulseH+ICS_PulseH;
ICS_Tik_PulseH++;
if(ICS_Tik_PulseH>=LICZBAPROBEK_ICS_PulseH){
Srednia_ICS_PulseH=(Suma_ICS_PulseH/ICS_Tik_PulseH);
ICS_Tik_PulseH=0;
Suma_ICS_PulseH=0;
ICS_bool_PulseH=true;
}
}
}
void setup() {
Serial.begin(9600);
pinMode(pinICSH, INPUT);
cli();
TCCR1A = 0;
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<CS11) | (1<<WGM12) ;
TCCR1C = 0;
OCR1A = (IC_Timers-1);
TIFR1 = (1<<ICF1) | (1<<TOV1);
TIMSK1 = (1<<ICIE1) | (1 << OCIE1A);
{ TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; } /// ustaw L/H
sei();
}
void loop() {
Serial.println( ICS_Okres);
Serial.println(Srednia_ICS_Okres);
Serial.println(ICS_PulseH);
Serial.println(Srednia_ICS_PulseH);
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.