Trong bài đăng trước mình đã hướng dẫn các bạn cách đo điện áp từ 0 - 5V rồi, trong bài này sẽ hướng dẫn các bạn cách đo điện áp lớn hơn 5V (0 - 10V). Như các bạn biết thì con PIC16F877A của chúng ta chỉ đo được điện áp từ 0 - 5V thôi. Như vậy nếu muốn đo điện áp lớn hơn 5V thì chúng ta phải làm sao ! Và trong bài này mình sẽ sử dụng 1 cầu chia áp như hình bên dưới.
- Với cầu chia áp như trên thì điện áp ra trên OUT sẽ được tính như sau :
- Với cầu chia áp như trên thì điện áp ra trên OUT sẽ được tính như sau :
voltage = 5000.0f / 1023 * ADCvalue * 2;
Tại sao lại nhân cho 2 tại vì trên mạch cầu chia áp chúng ta đã chia cho 2 rồi nên nếu muốn đo đúng giá trị điện áp chúng ta phải nhân lại cho 2.
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "LCD.h"
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
void ADCinit (void);
unsigned int ReadADC (void);
unsigned int ADCvalue = 0;
unsigned int voltage = 0;
char s[30];
void main(void)
{
TRISD = 0X00;
PORTD = 0;
ADCinit();
Lcd_Init();
Lcd_Set_Cursor(1,2);
Lcd_Write_String("DEMO 0 - 10V");
Lcd_Set_Cursor(2,2);
Lcd_Write_String("BY LAM 3 NGON");
__delay_ms(1000);
Lcd_Clear();
while(1)
{
ADCvalue = ReadADC();
voltage = 5000.0f / 1023 * ADCvalue * 2;
sprintf(s,"ADCvalue = %4u",ADCvalue);
Lcd_Set_Cursor(1,1);
Lcd_Write_String(s);
sprintf(s,"Voltage = %5u",voltage);
Lcd_Set_Cursor(2,1);
Lcd_Write_String(s);
Lcd_Write_String("V");
}
}
void ADCinit (void)// adc
{
// chon tan so clock cho bo adc
ADCON0bits.ADCS1 = 0, ADCON0bits.ADCS0 = 1;
// chon kenh adc la kenh an0
ADCON0bits.CHS3 = 0, ADCON0bits.CHS2 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS0 = 0;
// chon cach luu data
ADCON1bits.ADFM = 1;
// cap nguon cho khoi adc
ADCON0bits.ADON = 1;
}
unsigned int ReadADC (void)// doc len 7 doan
{
unsigned int TempValue = 0;
ADCON0bits.GO_nDONE = 1;
while(ADCON0bits.GO_nDONE);
TempValue = ADRESH*256 + ADRESL;
return (TempValue);
}
#include <stdlib.h>
#define _XTAL_FREQ 4000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "LCD.h"
// CONFIG1
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
void ADCinit (void);
unsigned int ReadADC (void);
unsigned int ADCvalue = 0;
unsigned int voltage = 0;
char s[30];
void main(void)
{
TRISD = 0X00;
PORTD = 0;
ADCinit();
Lcd_Init();
Lcd_Set_Cursor(1,2);
Lcd_Write_String("DEMO 0 - 10V");
Lcd_Set_Cursor(2,2);
Lcd_Write_String("BY LAM 3 NGON");
__delay_ms(1000);
Lcd_Clear();
while(1)
{
ADCvalue = ReadADC();
voltage = 5000.0f / 1023 * ADCvalue * 2;
sprintf(s,"ADCvalue = %4u",ADCvalue);
Lcd_Set_Cursor(1,1);
Lcd_Write_String(s);
sprintf(s,"Voltage = %5u",voltage);
Lcd_Set_Cursor(2,1);
Lcd_Write_String(s);
Lcd_Write_String("V");
}
}
void ADCinit (void)// adc
{
// chon tan so clock cho bo adc
ADCON0bits.ADCS1 = 0, ADCON0bits.ADCS0 = 1;
// chon kenh adc la kenh an0
ADCON0bits.CHS3 = 0, ADCON0bits.CHS2 = 0, ADCON0bits.CHS1 = 0, ADCON0bits.CHS0 = 0;
// chon cach luu data
ADCON1bits.ADFM = 1;
// cap nguon cho khoi adc
ADCON0bits.ADON = 1;
}
unsigned int ReadADC (void)// doc len 7 doan
{
unsigned int TempValue = 0;
ADCON0bits.GO_nDONE = 1;
while(ADCON0bits.GO_nDONE);
TempValue = ADRESH*256 + ADRESL;
return (TempValue);
}
2 nhận xét
Write nhận xétcám ơn bạn đã chia sẻ,thế cho mình hỏi cách đọc điện trở thì sao bạn
ReplyCái này cũng dễ thôi bạn search trên mạng cũng có nha !
ReplyEmoticonEmoticon