/******************************************************
- Test trên mạch R&P PIC16
- Động cơ sử dụng là loại nhỏ, áp vào 5V, tầm 200mA.
- Ý tưởng là so sánh áp vào chân adc >2.5V thì lấy áp đó trừ đi 2.5, rồi tất
cả nhân 2 để sao cho tại 5V (thực ra khoảng 4.98V) thì động cơ quay max, tại 2.5V động cơ dừng. Tương tự cho chiều ngược lại.
- Thực tế là trong tầm 2V-3V, đông cơ không quay, có lẽ do momen không đủ.
- Mấy cái vớ vẩn k2 viết, còn code đổi chiều Phát viết.
******************************************************/
#include <htc.h>
#include "stdlib.h"
#include "lcd.h"
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. word
__CONFIG(BORV21); //2st config. word
#define _XTAL_FREQ 4000000
void setup_adc()
{
TRISA3=1;
TRISE0=0;
ANSEL=0xFF;
ADCON0=0b00001101;
ADFM=1;
VCFG1=0;
VCFG0=0;
}
unsigned long adc_read()
{
unsigned long vol=0;
if (GODONE==0) // thuc te khong can kiem tra if .. o day
{
vol=ADRESH*256+ADRESL;
}
return vol;
}
void init_timer2()
{
T2CON=0x00; //prescaler 1:1, postscaler1:1
TMR2ON=1; //timner 2 on
}
void setup_pwm()
{
PR2=199; //Fpwm=5khz
CCP1CON=0x0C;
CCP2CON=0x0C;
CCPR1L=0x00;
CCPR2L=0x00;
TRISC2=0;
TRISC1=0;
}
void output_lcd()
{
unsigned char dvi, chuc, tram, ngan;
unsigned long adc_val;
adc_val=5*(adc_read())*1000/1024; //đoạn code này tham khảo của lee
dvi=adc_val%10;
adc_val=adc_val/10;
chuc=adc_val%10;
adc_val=adc_val/10;
tram=adc_val%10;
adc_val=adc_val/10;
ngan=adc_val%10;
lcd_gotoxy(0,1);
lcd_putc(0x30+ngan);
lcd_putc('.');
lcd_putc(0x30+tram);
lcd_putc(0x30+chuc);
lcd_putc(0x30+dvi);
lcd_puts(" Von");
}
void main()
{
setup_adc();
init_timer2();
setup_pwm();
lcd_init();
lcd_puts("Dien ap do duoc: ");
unsigned long pwm_val;
while(1)
{
GODONE=1;
while(GODONE); //cho adc chuyen doi xong
pwm_val=adc_read()*200/1023;
output_lcd();
if (pwm_val>100)
{
pwm_val=(pwm_val-100)*2;
CCPR2L=0x00; // tat kenh 2
__delay_us(10); //delay tranh trung dan
CCPR1L=pwm_val;
}
else
{
pwm_val=(100-pwm_val)*2;
CCPR2L=0x00; // tat kenh 1
__delay_us(10); //delay tranh trung dan
CCPR2L=pwm_val;
}
RE0=1; // motor enable
}
}