Bonsoir

J'ai écris le programme ci-bas pour utiliser le module ADC et PWM du pic 18f2320.

Le duty cycle du pwm est lié au résultat de la conversion.

Ma tension de référence est VDD =5V. Mon signale a convertir varie entre 0 et 5V à l'aide d'un potientiomètre.

Entre 4.2V et 5V tout est OK, le signal pwm varie bien du minimu au maximum.

Je cherche à savoir pourquoi les tensions comprises entre 0 et 4.2V ne sont pas prise en compte?

Est-ce un problème software ou hardware?

J'applique directement ma tention analogique sur le RA0 sans composant intermédiaire.



Programme:


//Controle PAN & TILT de la dolly
#include <p18f2320.h>
#include <delays.h>
#include <timers.h>
#include <pwm.h>
#include <adc.h>
#include <stdlib.h>

#pragma config OSC = XT
#pragma config WDT = OFF //disable watchdog
#pragma config LVP = OFF //disable low voltage programming

#define pan_g PORTBbits.RB7 //output
#define pan_d PORTBbits.RB6 //output
#define tilt_g PORTBbits.RB5 //output
#define tilt_d PORTBbits.RB4 //ouptut
#define led_pan_tilt PORTBbits.RB3 //output
//#define led_auto_manu PORTBbits.RB2 //output
#define g_pan PORTCbits.RC7 //input
#define d_pan PORTCbits.RC6 //input
#define g_tilt PORTCbits.RC5 //input
#define d_tilt PORTCbits.RC4 //input
//#define auto_manu PORTCbits.RC3 //input
#define pwm1 PORTCbits.RC2
#define pwm2 PORTCbits.RC1


int result_tilt;
int result_pan;
void main (void)
{

TRISC = 0b11111001;
PORTC = 0;
TRISB = 0b00000000;
PORTB = 0;
OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
OpenPWM1(160);
OpenPWM2(160);

while (1)
{
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD,15);
Delay10TCYx(2);//delay for 50TCY
ConvertADC();
while(BusyADC());
result_tilt = ReadADC();
CloseADC();
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH1 & ADC_INT_OFF & ADC_VREFPLUS_VDD,15);
Delay10TCYx(2);//delay for 20TCY
ConvertADC();
while(BusyADC());
result_pan = ReadADC();
CloseADC();

result_tilt = result_tilt+10;
result_pan =result_pan+10;

SetDCPWM1(result_tilt);
SetDCPWM2(result_pan);

if(g_pan && !d_pan) {pan_g=pwm1; pan_d=0;led_pan_tilt=1;}
if(!g_pan && d_pan) {pan_g=0; pan_d=pwm1;led_pan_tilt=1;}
if(!g_pan && !d_pan) {pan_g=0; pan_d=0;led_pan_tilt=0;}
if(g_tilt && !d_tilt) {tilt_g=pwm2; tilt_d=0;led_pan_tilt=1;}
if(!g_tilt && d_tilt) {tilt_g=0; tilt_d=pwm2;led_pan_tilt=1;}
if(!g_tilt && !d_tilt) {tilt_g=0; tilt_d=0;led_pan_tilt=0;}

}//end while


}//end main