Тема: Измерить индуктивности на LGT8F328
Основная статья - http://rcl-radio.ru/?p=131780
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
#define CAL 31249;
#define CAP 1000.0 // pF
extern uint8_t SmallFont[],BigNumbers[];
unsigned long f_out,tic;
void setup() {
Serial.begin(9600);
Wire.begin();
PORTD |= (1 << PD5); // подтягивающий резистор на PD5 (вход T1)
// TIMER_1 INPUT T1
TCCR1A = 0;TCCR1B = 0;TCNT1=0;
TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10);
TIMSK1 = (1 << TOIE1);
TCKCSR = (1 << F2XEN) | (1 << TC2XS1);
// TIMER_3 1 SEC
// (32000000/((31249+1)x1024))=1 Hz
TCCR3A = 0;
TCCR3B = 0;
TCNT3=0;
TCCR3B = (1 << CS32) |(1 << CS30) | (1 << WGM32);
TIMSK3 = (1 << OCIE3A);
OCR3A = CAL;
// TIMER_2 OUTPUT 8 MHz
TCCR2A = 0;TCCR2B = 0;TCNT2=0;
TCCR2A = 1 << COM2A0 |1 << WGM21;
TCCR2B = 1 << CS20;
OCR2A = 0;
C0SR = 0;C0XR=0;
C0XR |=(1<<C0OE); // C0OE[7] = 1, выход компаратора AC0 для внешнего порта PD2
// ВЫБОР ИНВЕРСНОГО ВХОДА
ADCSRB = 0b01000000;// ADMUX
/*
CME01[7] CME00[6] Источник входного сигнала AC0
0 0 ACXN
0 1 ADMUX
1 0 DFFO
*/
ADMUX = 0b00000000; // CHMUX[3:0] = 0000 Источник входного сигнала PC0 (A0)
// ВЫБОР НЕИНВЕРСНОГО ВХОДА
C0SR &=~(1<<C0BG);C0XR &=~(1<<C0PS0);
/*
C0BG C0PS0 Источник входного сигнала AC0
0 0 AC0P
0 1 ACXP
1 0 DAO
*/
delay(100);
}
void loop() {
float l_iz = 1/(4*3.14*3.14*f_out*f_out*CAP*pow(10,-12))*1000000.0;
if(l_iz>100000||l_iz<0){l_iz=0;}
Serial.print(l_iz,2);Serial.println(" uH");
Serial.print(f_out);Serial.println(" Hz");
u8g.firstPage(); do {
u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(0,25);
if(l_iz<1000){u8g.print(l_iz,2);u8g.drawStr(97,25,"uH");}
if(l_iz>=1000){u8g.print(l_iz/1000,2);u8g.drawStr(97,25,"mH");}
}while( u8g.nextPage() );
delay(1000);
}
ISR(TIMER1_OVF_vect) {tic++;}
ISR(TIMER3_vect) {
if (TIFR3 & (1 << OCF3A)){
TIFR3 = 1 << OCF3A;
f_out = tic*0xFFFF + TCNT1;
tic=0;TCNT1=0;
}}