PDA

View Full Version : Cần giúp đỡ gấp!!!


hotdoglo
20-12-2010, 08:38 PM
Đoạn code sau mình set chân A0 là chân ADC, tín hiệu PWM chân C2 (CCP1). Khi dùng proteus thì mô phỏng ra tín hiệu. Nhưng khi dùng oscilloscope để kiểm tra thì ko có tín hiệu trên chân CCP1. Bạn nào giúp mình với






#include <16f877A.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, LVP, NOCPD, NOWRT
#use delay(clock=20000000)
#define use_portd_lcd TRUE
#use fast_io (b)
#include <lcd.c>
int dem;
float v_set,v_cur,v_truoc,v_truoc2; // v_cur: hien tai, v_truoc: lan doc truoc, v_truoc2: lan doc truoc nua
int16 u;
float x,count; //e: sai so hien tai, e_1: sai so truoc, e_2: sai so truoc nua, u:duty cycle
void main()
{
// delay_ms(5000); // delay tao khoi dong
delay_ms(100); // tao tre 100ms cho LCD khoi dong
lcd_init();

u=1000;

setup_adc_ports( AN0_AN1_AN3);
setup_adc(ADC_CLOCK_DIV_8);
SETUP_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_16,0xff,1); // tan so pwm =19.2 Khz

///////////////////////// Tinh he so PID//////////////////////////
while (1)
{
set_adc_channel ( 0 );
delay_ms(500);
u= read_adc ();

set_PWM1_duty(u);
lcd_gotoxy (1,1);
printf(lcd_putc, " u=%lu",u);
delay_ms (100);
}

}

trungduc
23-12-2010, 12:30 AM
Mình có 1 chương trình viết bằng ASM lấy ADC từ A0 đưa ra CCP1 và CCP2 dùng điều khiển tốc độ motor hoặc RC servo

PROCESSOR 16F877A
#INCLUDE "P16F877A.INC"
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

COUN EQU 0x20
COUN1 EQU 0x21

ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BSF STATUS,RP0
MOVLW 0x00
MOVWF TRISB
LOOP
CALL ADC_ROUTINE
CALL PWM_ROUTINE
GOTO LOOP

;================================================= ================================================== ====

ROUTINE

;================================================= ================================================== ====

ADC_ROUTINE

MOVLW 0x0E ; Vref+ = Vdd, Vref- = Vcc, AN0 = ANALOG, ALL DIGITAL
MOVWF ADCON1
MOVLW 0x01
MOVWF TRISA
BCF STATUS,RP0
MOVLW 0x01 ;CHON RA0 LAM NGO VAO,ADON=1,BAT ADC
MOVWF ADCON0
MOVLW D'10'
MOVWF COUN
BACK MOVLW D'4' ;CHO 1 KHOANG THOI GIAN TRUOC KHI BAT DAU
MOVWF COUN1
DECFSZ COUN1,F
GOTO $-1
DECFSZ COUN,F
GOTO BACK
BSF ADCON0,GO ;SET BIT "GO",BAT DAU CONVERT
;--------------------------------------- KIEM TRA KET QUA -----------------------------
BTFSC ADCON0,GO ;KIEM TRA BIT "DONE" CUA ADCON0
GOTO $-1
MOVF ADRESL,0
MOVWF PORTB
RETURN


;================================================= ================================================== ====


PWM_ROUTINE

MOVWF CCPR1L
MOVWF CCPR2L

BANKSEL TRISC
MOVLW D'0' ;set PORTC as all outputs
MOVWF TRISC
BANKSEL PORTC
MOVLW 0x0C
MOVWF CCP1CON
MOVLW 0x0C
MOVWF CCP2CON

MOVLW D'255' ;set highest PWM value
BANKSEL PR2 ;over this (255) is permanently on
MOVWF PR2
BANKSEL TMR2

MOVLW 0x02
MOVWF T2CON

BSF T2CON, TMR2ON ;and start the timer running

RETURN


END