02-11-2020, 18:13
Jak najbardziej ale to wymaga wiedzy timer2 w ICP....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Ocena wątku:
Pomiar częstotliwości wejściem DC
|
setup()
{
attachInterrupt(0, cykl, RISING); //LOW, HIGH, CHANGE, FALLING, RISING
}
//itd
void cykl()
{
impulsow++;
}
#define IC_Timers 16000 // przepelnienie licznika 16bit emilinacja sygnalow powyzej 8ms..
volatile uint16_t ICS_Tim =0; // odczytany licznik zegara timer1
volatile uint8_t ICS_timout =0; // czas time out sygnału
volatile bool ICS_zbocze = false; // wybor zbocza przerwania Inmput Capture
ISR(TIMER1_COMPA_vect) { // przepełnienie timera 8ms
if(ICS_zbocze){
{ TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; } /// ustaw ICP L/H
}else{
ICS_timout++;
////////////// wyzerowanie okresu po zaniku sygnalu
if(ICS_timout >=62){ /// tim out oklo 500ms
ICS_timout=0;
ICS_Tim = 0; // wyzeruj okres
}
}
}
ISR(TIMER1_CAPT_vect) { // przerwanie input capture
if (ICS_zbocze) {
TCCR1B |= (1<<ICES1);
TIFR1 |= (1<<ICF1);
ICS_zbocze = false; // zmien wyzwolenie na zbocze L/H
ICS_Tim = ICR1; // odczytaj aktualny stan licznika
TCNT1 = 0x00; // wyzeruj licznik
}else {
TCCR1B &= ~(1<<ICES1);
TIFR1 |= (1<<ICF1);
ICS_zbocze = true; // zmien wyzwolenie na zbocze high-low
ICS_timout=0; // wyzeruj przepelnienie licznika
}
}
void setup() {
pinMode(8, INPUT);
// TIMER_1 ICP od 15 do 100
//zbocze low-high (TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); zbocze = 0;);
//zbocze high-low (TCCR1B &= ~(1<<ICES1); TIFR1 |= (1<<ICF1); zbocze = 1;);
cli();
TCCR1A = 0;
TCCR1B = (0<<ICNC1) | (1<<CS11) | (1<<WGM12) ;
TCCR1C = 0;
OCR1A = (IC_Timers-1);
TIFR1 = (1<<TOV1);
TIMSK1 = (1<<ICIE1) | (1 << OCIE1A);
{ TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; } /// ustaw L/H
sei();
}
void loop() {
// ICS_Tim zwraca okres z dokładnością 1us...
}