Опубликовано 2013-05-02 16:24:12 автором MRS

Цифровий амперметр на мікроконтролері


У попередній статті цифровий вольтметр на мікроконтролері ми навчилися вимірювати напругу за допомогою АЦП, і у вас , напевно, ще тоді виникло питання : а як же виміряти струм ? Про це ми і поговоримо в цьому пості . З напругою все просто: пропустив через дільник напруги (якщо потрібно ) і подав на АЦП , а як же на рахунок струму? Для вимірювання струму можна піти двома шляхами:
  • Вимірювати падіння напруги на шунті (резистор відносно невеликого опору)

    схема ОУ в якості усілітеля

  • Використовувати датчик Холла для вимірювання магнітного поля схема ОУ в якості усілітеля

    Магнітне поле , що виробляється провідником , пропорційно току , який через нього тече. Датчик струму на ефекті Холла має датчик магнітного поля , який виробляє напругу , пропорційну магнітному полю . Безсумнівною перевагою датчика струму на ефекті Холла є розв'язка ланцюгів вимірювання та вимірювача струму.

Перший варіант простіший , ну і тут свої граблі. Справа в тому , що опір шунта невеликий, відповідно, падіння напруги на ньому теж буде невеликим. Збільшивши опір шунта , щоб падіння напруги на ньому було хоч якось помітно для АЦП , ми збільшимо втрати на шунт P = I 2 * R.Тут напрошується операційний підсилювач (це штука , яка вміє множити напруги. Наприклад , якщо у нас напруга змінюється в діапазоні 0-0,1 вольт , то пропустивши через ОУ з коефіцієнтом посилення 50 , ми отримаємо діапазон 0-5 вольт). Схема включення ОУ у якості підсилювача шунта показана нижче

схема ОУ в якості усілітеля

Сигнал від датчика посилюється підсилювачем DA1.1 , буферизується повторювачем DA1.2 ( може бути відсутнім) . Резистором R2 можна регулювати коефіцієнт посилення ОУ (чутливість датчика) розраховується за формулою U out = U inp * ( 1 + R 1 / R 2 ) .
Загальна схема цифрового амперметра схема цифрового амперметра На схемі напруга з шунта R2 посилюється операційним підсилювачем lm358 . Коефіцієнт посилення регулюється підлаштувальним резистором RV1 . Далі посилений сигнал потрапляє на ніжку АЦП adc0 . На регульованому стабілітроні tl431 побудоване джерело опорної напруги на 5,12 вольт. Приступаємо до програмної частини проекту . Вихідний код представлений нижче

# include <mega8.h>  
# include <delay.h>  
 
 // Alphanumeric LCD Module functions  
# asm  
   . equ __ lcd_port = 0x12 ; PORTD  
# endasm  
# include <lcd.h>  
    
# include <stdio.h> // бібліотека , в якій лежить функція sprintf  
# define ADC_VREF_TYPE 0x00  
 
 // Read the AD conversion result  
unsigned int read_adc ( unsigned char adc_input )  
{  
ADMUX = adc_input | ( ADC_VREF_TYPE & 0xff ) ;  
 // Delay needed for the stabilization of the ADC input voltage  
delay_us ( 10 ) ;  
 // Start the AD conversion  
ADCSRA | = 0x40 ;  
 // Wait for the AD conversion to complete  
while ( ( ADCSRA & 0x10 ) == 0 ) ;  
ADCSRA | = 0x10 ;  
return ADCW ;  
}  
 
void main ( void )  
{  
char buffer [ 32 ] ;  // змінна, в якій буде формуватися рядок для виведення на lcd  
int adc ;  // змінна для зберігання значень АЦП  
int u ;  // змінна для зберігання напруги  
float a ;  // змінна для зберігання струму  
 
PORTB = 0x00;  
DDRB = 0x00;  
 
 // Port C initialization  
PORTC = 0x00;  
DDRC = 0x00;  
 
 // Port D initialization  
PORTD = 0x00;  
DDRD = 0x00;  
 
 // Timer / Counter 0 initialization  
 // Clock source : System Clock  
 // Clock value : Timer 0 Stopped  
TCCR0 = 0x00;  
TCNT0 = 0x00;  
 
 // Timer / Counter 1 initialization  
 // Clock source : System Clock  
 // Clock value : Timer1 Stopped  
 // Mode: Normal top = FFFFh  
 // OC1A output : Discon .  
 // OC1B output : Discon .  
 // Noise Canceler : Off  
 // Input Capture on Falling Edge  
 // Timer1 Overflow Interrupt : Off  
 // Input Capture Interrupt : Off  
 // Compare A Match Interrupt : Off  
 // Compare B Match Interrupt : Off  
TCCR1A = 0x00;  
TCCR1B = 0x00;  
TCNT1H = 0x00;  
TCNT1L = 0x00;  
ICR1H = 0x00;  
ICR1L = 0x00;  
OCR1AH = 0x00;  
OCR1AL = 0x00;  
OCR1BH = 0x00;  
OCR1BL = 0x00;  
 
 // Timer / Counter 2 initialization  
 // Clock source : System Clock  
 // Clock value : Timer2 Stopped  
 // Mode: Normal top = FFh  
 // OC2 output : Disconnected  
ASSR = 0x00;  
TCCR2 = 0x00;  
TCNT2 = 0x00;  
OCR2 = 0x00;  
 
 // External Interrupt ( s ) initialization  
 // INT0 : Off  
 // INT1 : Off  
MCUCR = 0x00;  
 
 // Timer ( s ) / Counter ( s ) Interrupt ( s ) initialization  
TIMSK = 0x00;  
 
 // Analog Comparator initialization  
 // Analog Comparator : Off  
 // Analog Comparator Input Capture by Timer / Counter 1 : Off  
ACSR = 0x80 ;  
SFIOR = 0x00;  
 
 // ADC initialization  
 // ADC Clock frequency : 500,000 kHz  
 // ADC Voltage Reference : AREF pin  
ADMUX = ADC_VREF_TYPE & 0xff ;  
ADCSRA = 0x81 ;  
 
 // LCD module initialization  
lcd_init ( 16 ) ;  
 
while ( 1 )  
      {  
       adc = read_adc (0);  // Читаємо АЦП з порту 0  
           /* Струм, що протікає через шунт , обчислюється за законом Ома: I = U / R  
            R = 0,1 ом , a U (падіння напруги на шунті ) ми будемо вимірювати .  
            Так як АЦП у нас 10-бітний , то максимальне число , яке поверне функція read_adc ( ) ,  
           дорівнюватиме 1024 , це число буде еквівалентом напруги на вході adc0 .  
           Наприклад , якщо read_adc ( ) повернув 512 , то це означає , що на вхід adc0 ми подали половину опорної напруги  
           Щоб обчислити реальну напругу , нам потрібно скласти пропорцію:  
            опорна напруга - 1024  
            шукана напруга - adc  
            У нас опорна напруга = 5.12  
            Шукане напруга = 5.12 * adc/1024 або шукана напруга = 0,005 * adc  
            для простоти переведемо вольти в мілівольти , домноживши на 1000  
            Шукана напруга = 0,005 * adc * 1000  
            Тут все добре , але ми не врахували коефіцієнт посилення ОУ  
            розраховується за формулою: Кус = 1 + R1/R2 . Підставивши , отримаємо  
            Кус = ( 1 +4 ) = 5  
            Реальна напруга = 0,005 * adc * 1000 / 5 отримуємо просто adc  
            */  
            u = adc ;  
           sprintf ( buffer , "I = % d , % 02d A " ,  
           ( int ) ( u/100 ) , / * отримуємо струм за законом ома I = U / R * /  
           ( int ) ( u % 100)  // Дробова частина струму  
           ) ;  // формуємо рядок для виведення  
           lcd_clear ();  // чистимо дисплей перед виведенням  
           lcd_puts ( buffer ) ;  // виводимо сформований рядок на дисплей  
           delay_ms (100);  // робимо затримку  
      } ;  
}


Проект в протеус і вихідний код в архіві Ampermeter_P

У наступній статті опишу , як зробити простий ватметр на мк

Комментарии - (4)

  • Илья говорит:
    Столкнулся с проблемой измерения силы тока при помощи МК, именно усилителя токового шунта, нашёл то что искал. Автору СПАСИБО.
  • Geha говорит:
    Есть приборы (расходомеры)с токовым выходом. И у меня есть идея собрать прибор миллиамперметр на AVR с расчетом и выводом на экран расхода в М3/ч или Т/ч. Как осуществить?
    • Admin говорит:
      Нужно смотреть что у вас на выходе расходометра, он цыфровой или аналоговый? если аналоговый, кидаете, выход на ножку ацп и измеряете показания, если цыфровой то разбираете протокол его работы. Но здается мне что ваш расходометр, просто изменяет частоту на выходе типа этого http://greenchip.com.ua/28-0-291-0.html , тогда меряете частоту каким то таймером.

Добавить комментарий

Для отправки комментария вы должны авторизоваться.