|
20-12-2010, 08:38 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Nov 2010
Bài gửi: 1
: |
Cần giúp đỡ gấp!!!
Đ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); } } |
23-12-2010, 12:30 AM | #2 |
Đệ tử 2 túi
Tham gia ngày: Oct 2008
Bài gửi: 44
: |
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 |
|
|