CAN PIC 18F2550
Zerd
-
Zerd -
Zerd -
Bonjour,
Je travaille sur un projet où je dois, entre autre, acquérir un signal analogique (sinusoïde d'amplitude 5V), et le traiter, en déterminant quand il est plus petit que 2V par exemple. Je dois faire cette fonction via un PIC, il me faut donc un CAN. Malheureusement, en essayant d'utuliser les librairies du constructeur, cela bloque. J'utilise MPLab MCC18 avec un PIC 18F2550 sur une carte MPLab ICD2. J'ai donc tenté de faire de la sorte :
[quote=""]#include <delays.h>
#include <p18f2550.h>
#include <xlcd.h>
#include <stdio.h>
int iValAD;
int iResultat;
char cT;
void DelayFor18TCY( void )
{
Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop();
Nop(); Nop();
}
void delay_4_0us(void){
}
void delay_ms(unsigned long tempo){
unsigned long int j,k;
for(j=0;j<tempo;j++){
for(k=0;k<40;k++){
}
}
}
void delay_s(unsigned long tempo){
unsigned long int i;
for(i=0;i<tempo;i++){
delay_ms(1000);
}
}
void train(void) //cette fonction crée une période
{ PORTBbits.RB1=1; //une action dure 1 us à être exécutée
PORTBbits.RB1=1;
PORTBbits.RB1=1;
PORTBbits.RB1=1;
delay_4_0us();
delay_4_0us();
PORTBbits.RB1=0;
PORTBbits.RB1=0;
PORTBbits.RB1=0;
delay_4_0us();
delay_4_0us();
}
void emetteur(void) //crée le signal vers l'émetteur
{ unsigned long i;
train();
train();
train();
train();
train();
train();
train();
train();
PORTBbits.RB1=0;
}
void initRA0anal(void)
{ ADCON2bits.ADCS2=1; ADCON2bits.ADCS1=0; ADCON2bits.ADCS0=0; //On définit la période d'horloge pour la conversion Fosc/4
ADCON2bits.ACQT0=1; //On définit le temps d'acquisition( TACQ = 2 TAD; environ 2.6µs )
ADCON2bits.ACQT1 = 0;
ADCON2bits.ACQT2 = 0;
ADCON0bits.CHS3=0; ADCON0bits.CHS2=0; ADCON0bits.CHS1=0; ADCON0bits.CHS0=0; //sélection de l'entrée analogique RA0
ADCON1bits.PCFG3=1; ADCON1bits.PCFG2=1; ADCON1bits.PCFG1=0; ADCON1bits.PCFG0=1;
ADCON2bits.ADFM=1; //justification bit à droite registre de réception ADRESH ADRESL
ADCON1bits.VCFG0=0; //On prend comme réferences les tensions d'alimentation
ADCON1bits.VCFG1 = 0;
}
int convertanal(void)
{ ADCON0bits.ADON=1; //activation du convertisseur
cT=6;
while(cT--); //tempo de 23µs
iValAD=0;
ADCON0bits.GO_DONE=1; //démarrage conversion
while(ADCON0bits.GO_DONE); //si GO_DONE passe à 0 fin de conversion
iValAD=ADRESH;
iValAD<<=8;
iValAD=ADRESL; //le résultat est contenu dans iValAD
ADCON0bits.ADON=0; //convertisseur arrêté
return iValAD;
}
void main(void)
{ int i;
char chaine[30];
TRISB=0b10000000;
TRISA=0b11111101;
initRA0anal();
while(1) //se démarrera uniquement lorsque l'on veut détecter.
{ emetteur();
for(i=0;i<10;i++)
{ itoa(chaine,convertanal(),3);
putsXLCD(chaine);
}
}
}/quote
Je travaille sur un projet où je dois, entre autre, acquérir un signal analogique (sinusoïde d'amplitude 5V), et le traiter, en déterminant quand il est plus petit que 2V par exemple. Je dois faire cette fonction via un PIC, il me faut donc un CAN. Malheureusement, en essayant d'utuliser les librairies du constructeur, cela bloque. J'utilise MPLab MCC18 avec un PIC 18F2550 sur une carte MPLab ICD2. J'ai donc tenté de faire de la sorte :
[quote=""]#include <delays.h>
#include <p18f2550.h>
#include <xlcd.h>
#include <stdio.h>
int iValAD;
int iResultat;
char cT;
void DelayFor18TCY( void )
{
Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop();
Nop(); Nop(); Nop(); Nop();
Nop(); Nop();
}
void delay_4_0us(void){
}
void delay_ms(unsigned long tempo){
unsigned long int j,k;
for(j=0;j<tempo;j++){
for(k=0;k<40;k++){
}
}
}
void delay_s(unsigned long tempo){
unsigned long int i;
for(i=0;i<tempo;i++){
delay_ms(1000);
}
}
void train(void) //cette fonction crée une période
{ PORTBbits.RB1=1; //une action dure 1 us à être exécutée
PORTBbits.RB1=1;
PORTBbits.RB1=1;
PORTBbits.RB1=1;
delay_4_0us();
delay_4_0us();
PORTBbits.RB1=0;
PORTBbits.RB1=0;
PORTBbits.RB1=0;
delay_4_0us();
delay_4_0us();
}
void emetteur(void) //crée le signal vers l'émetteur
{ unsigned long i;
train();
train();
train();
train();
train();
train();
train();
train();
PORTBbits.RB1=0;
}
void initRA0anal(void)
{ ADCON2bits.ADCS2=1; ADCON2bits.ADCS1=0; ADCON2bits.ADCS0=0; //On définit la période d'horloge pour la conversion Fosc/4
ADCON2bits.ACQT0=1; //On définit le temps d'acquisition( TACQ = 2 TAD; environ 2.6µs )
ADCON2bits.ACQT1 = 0;
ADCON2bits.ACQT2 = 0;
ADCON0bits.CHS3=0; ADCON0bits.CHS2=0; ADCON0bits.CHS1=0; ADCON0bits.CHS0=0; //sélection de l'entrée analogique RA0
ADCON1bits.PCFG3=1; ADCON1bits.PCFG2=1; ADCON1bits.PCFG1=0; ADCON1bits.PCFG0=1;
ADCON2bits.ADFM=1; //justification bit à droite registre de réception ADRESH ADRESL
ADCON1bits.VCFG0=0; //On prend comme réferences les tensions d'alimentation
ADCON1bits.VCFG1 = 0;
}
int convertanal(void)
{ ADCON0bits.ADON=1; //activation du convertisseur
cT=6;
while(cT--); //tempo de 23µs
iValAD=0;
ADCON0bits.GO_DONE=1; //démarrage conversion
while(ADCON0bits.GO_DONE); //si GO_DONE passe à 0 fin de conversion
iValAD=ADRESH;
iValAD<<=8;
iValAD=ADRESL; //le résultat est contenu dans iValAD
ADCON0bits.ADON=0; //convertisseur arrêté
return iValAD;
}
void main(void)
{ int i;
char chaine[30];
TRISB=0b10000000;
TRISA=0b11111101;
initRA0anal();
while(1) //se démarrera uniquement lorsque l'on veut détecter.
{ emetteur();
for(i=0;i<10;i++)
{ itoa(chaine,convertanal(),3);
putsXLCD(chaine);
}
}
}/quote
A voir également:
- CAN PIC 18F2550
- Pic hunter - Télécharger - Téléchargement & Transfert
- Pic collage gratuit - Télécharger - Photo & Graphisme
- Can you run it avis ✓ - Forum Jeux vidéo
- Roissy hub bscc pic ✓ - Forum Consommation & Internet
- Entrée dans le réseau des pic ✓ - Forum Consommation & Internet
4 réponses
Bonsoir, je fais un petit up.
Après de nombreuses recherches, impossible de trouver la raison de ce problème. Le soucis étant que mon projet allie à la fois numérique et analogique. Sans ce CAN je ne peux donc pas avancer :(
Après de nombreuses recherches, impossible de trouver la raison de ce problème. Le soucis étant que mon projet allie à la fois numérique et analogique. Sans ce CAN je ne peux donc pas avancer :(
Salut,
Sur quelle entrée du micro tu dois faire ta mesure?(Quel port et Pinoche...)
A priori PORTA,et pinoche 0?
Je connais pas trop ce pic...mais bon le principe reste le même...
@+
Sur quelle entrée du micro tu dois faire ta mesure?(Quel port et Pinoche...)
A priori PORTA,et pinoche 0?
Je connais pas trop ce pic...mais bon le principe reste le même...
@+
Merci de ta réponse,
Pour ce qui est des questions, je fais arriver le signal à tester en PORT A pinoche 0 en effet : RA0
J'ai donc fait entrer un signal sinusoïdale pour tester la numérisation. Cà donne quelque chose de potable mais avec un bruit plus important que le signal numérisé lui-même. Donc impossible de le traiter derrière. J'ai aussi essayé de changer la période de numérisation, les seuils d'intensité min/max pour essayer de passer au-delà du bruit mais rien n'y fait.
Pour ce qui est des questions, je fais arriver le signal à tester en PORT A pinoche 0 en effet : RA0
J'ai donc fait entrer un signal sinusoïdale pour tester la numérisation. Cà donne quelque chose de potable mais avec un bruit plus important que le signal numérisé lui-même. Donc impossible de le traiter derrière. J'ai aussi essayé de changer la période de numérisation, les seuils d'intensité min/max pour essayer de passer au-delà du bruit mais rien n'y fait.
Salut,
En effet, perso, on passe par une sommation de 10 resultats, puis un lissage par un tableau avec les anciennes valeurs sur 10 valeurs....
#define _NBSCROLL 10
ulong somme = 0;
for (i=0; i<10; i++) {
ADCON1bits.SAMP = 1; // start a conversion
while( !ADCON1bits.DONE );
result = ADCBUF0 & 0x0FFF;
somme+=result;
}
ADCON1bits.ADON = 0;
for (i=0; i<_NBSCROLL-1; i++) {
MUXV[MUX_channel][i] = MUXV[MUX_channel][i+1];
d+= MUXV[MUX_channel][i];//
}
MUXV[MUX_channel][_NBSCROLL-1] = somme;
result = (d + somme) / (_NBSCROLL*10);//
peut-etre ca pourra t'aider!!
@+
En effet, perso, on passe par une sommation de 10 resultats, puis un lissage par un tableau avec les anciennes valeurs sur 10 valeurs....
#define _NBSCROLL 10
ulong somme = 0;
for (i=0; i<10; i++) {
ADCON1bits.SAMP = 1; // start a conversion
while( !ADCON1bits.DONE );
result = ADCBUF0 & 0x0FFF;
somme+=result;
}
ADCON1bits.ADON = 0;
for (i=0; i<_NBSCROLL-1; i++) {
MUXV[MUX_channel][i] = MUXV[MUX_channel][i+1];
d+= MUXV[MUX_channel][i];//
}
MUXV[MUX_channel][_NBSCROLL-1] = somme;
result = (d + somme) / (_NBSCROLL*10);//
peut-etre ca pourra t'aider!!
@+