em vừa nhận 1 bài tâp như sau:
thiết kế 1 mạch điều khiển động cơ DC bằng thysistor(không đảo chiều). Về phần cứng em đã thiết kế được nhưng phần mêm thi lai lỗi ở phần xuất PWM.
em dùng time0 và time2 để điều khiển xung PWm xuất ra 2 chân RC1 (PWM1) và RC2 (PWM2). khi viết riêng phần nay thi no chạy ngon lanh nhưng khi ghép nó vào chương trình chính thi chỉ có PWM xuất ra ở chân RC2. em tìm hết cách mà vẫn vậy mong mn giup em với.
đây ra osilo em đo khi chạy riêng 2 PWM:

đây là osilo khi chương trình chính của em chạy:



đây là chương trinh và mach cua em:
mong mn giup em voi!!!!!!!!
thiết kế 1 mạch điều khiển động cơ DC bằng thysistor(không đảo chiều). Về phần cứng em đã thiết kế được nhưng phần mêm thi lai lỗi ở phần xuất PWM.
em dùng time0 và time2 để điều khiển xung PWm xuất ra 2 chân RC1 (PWM1) và RC2 (PWM2). khi viết riêng phần nay thi no chạy ngon lanh nhưng khi ghép nó vào chương trình chính thi chỉ có PWM xuất ra ở chân RC2. em tìm hết cách mà vẫn vậy mong mn giup em với.
đây ra osilo em đo khi chạy riêng 2 PWM:
đây là osilo khi chương trình chính của em chạy:
đây là chương trinh và mach cua em:
Code:
#include <16f877a.h>
#device *=16 adc=10
#use delay(clock=4000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd.c>
#include <math.h>
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
int a0=0,b0=0,a1=0,b1=0;
float adc=0,adc1=0;
int dem=0,dem2=0, value=0;
#INT_TIMER0
void TIMER0_isr(void)
{
if(input(PIN_C0)==1){
dem++;
if(dem>=value)output_high(PIN_C1);
if(dem>=100){dem=0;output_low(PIN_C1);}
output_low(PIN_C2);
}}
#INT_TIMER2
void TIMER2_isr(void)
{
if(input(PIN_C0)==0){
dem2++;
if(dem2>=value)output_high(PIN_C2);
if(dem2>=100){dem2=0;output_low(PIN_C2);}
output_low(PIN_C1);
}}
void doc_adc_0()
{
set_adc_channel(0);
delay_us(10);
adc=read_adc();
delay_us(100);
adc=(adc)/2.048;
a0=(int)adc/10;
b0=(int)adc-a0*10;
}
void doc_adc_1()
{
set_adc_channel(1);
delay_us(10);
adc1=read_adc();
adc1=(adc1)/2.048;
delay_us(100);
a1=(int)adc1/10;
b1=(int)adc1-a1*10;
}
void hienthi()
{ lcd_init();
lcd_gotoxy(1,1);lcd_putc("dat_DC:");
lcd_gotoxy(12,1);lcd_putc(a0+0x30);lcd_putc(b0+0x30);lcd_putc("V");
lcd_gotoxy(1,2);lcd_putc("dienap_DC:");
lcd_gotoxy(12,2);lcd_putc(a1+0x30);lcd_putc(b1+0x30);lcd_putc("V");
}
void main()
{
set_tris_a(0b00011111);//4 chan RA0-RA3 nhan du lieu tu ban phim
set_tris_c(0x00);
set_tris_d(0x00);//port D la port xuat du lieu ra LCD
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
output_low(PIN_C1);output_low(PIN_C2);input(PIN_C0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
set_timer0(155); // timer0 s? tràn sau m?i 100us
enable_interrupts(INT_TIMER0);
setup_timer_2(T2_DIV_BY_1,99,1);
enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL);
while(true)
{value=80; // giá tri dieu khien do rong xung PWM1,PWM2
if(dem2==value)
{delay_us(10);
doc_adc_0();
doc_adc_1();
hienthi();
}
}
}

Comment