program gretel1.pbas ' ____ ____ _____ _____ _____ _ ' / ___| _ \| ____|_ _| ____| | ' | | _| |_) | _| | | | _| | | ' | |_| | _ <| |___ | | | |___| |___ ' \____|_| \_\_____| |_| |_____|_____| ' '************************************************************************* ' Commande PWM à deux sens de marche par potentiomètre ordinaire '************************************************************************* ' COPYRIGHT 2008 JC GRIMALDI POUR PTITRAIN ' http://www.ptitrain.com/electronique/microp/page53/index.htm ' ************************************************************************ ' Alimentation de type PWM commandée par un potentiomètre AR-0-AV : ' la tension de 0 à 5v du potentiomètre est transformée en 127-0-127 ' et le sens de marche AV/AR est détecté pour commander l'inversion. ' Pour éviter des vibrations dans le moteur à l'arrêt, une bande morte ' est réservée autour du zéro. ' Le temps de la mesure analogique est d'environ 20µs. Le programme étant ' séquentiel, pour permettre d'atteindre l'intensité maximale ou minimale ' la mesure n'est faite et traitée que tous les n cycles (il serait possible ' de faire la mesure pendant le cycle, mais cela ne parait pas nécessaire). ' La prochaine version intègrera une détection de surintensité ' avec réarmement soit manuel soit automatique après 1 seconde (au choix). '************************************************************************* ' Branchements: ' GP0 (Patte 7) Shunt de mesure d'Intensité (réservé pour futur) ' GP1 (Patte 6) Sortie PWM vers transistor de puissance ' GP2 (Patte 5) Potentiomètre de référence ' GP3 (Entrée4) Reset si pas réarmement auto après 1s (réservé pour futur) ' GP4 (Patte 3) Sortie alarme sur-intensité (réservée pour futur) ' GP5 (Patte 2) Sortie pour relais d'inversion en sens AR '************************************************************************* dim mesure as word ' variable 0-1023 (mesure sur 10 bits) dim reference as byte ' variable 0-255 (ref potentiomètre) dim amplitude as byte ' variable 0-255 (valeur sortie PWM) dim i as byte ' variable 0-255 (compteur de cycles) dim j as byte ' variable 0-255 (compteur de cycles) '************************************************************************* ' Sous programme commande sortie PWM '************************************************************************* sub procedure sortiePWM (dim byref ampli as byte) if ampli>0 then ' pas de commande à l'arrêt setbit (GPIO,1) ' sortie PWM activée for i=0 to ampli ' nombre de cycles actifs Delay_us(10) ' sans délai f=600Hz avec f=330Hz next i clearbit (GPIO,1) ' sortie PWM au repos for i=ampli to 122 ' nombre de cycles au repos Delay_us(10) next i end if end sub '************************************************************************* ' Sous programme pilotage fonctionnement à double sens '************************************************************************* sub procedure doublesens (dim byref refpot as byte) if refpot > 127 then ' marche avant si ref>V/2 amplitude = refpot - 128 ' amplitude V/2 à V -> 0 à 127 clearbit (GPIO,5) ' relais d'inversion au repos else ' marche arrière si ref 127 à 0 setbit (GPIO,5) ' relais d'inversion activé end if if amplitude > 5 then ' détection seuil bande morte amplitude = amplitude - 5 ' amplitude utile de 1 à 122 else amplitude = 0 ' bande morte autour du 0 end if end sub '************************************************************************* ' Programme principal '************************************************************************* main: ANSEL = 4 ' entrée AN2 analogique (3=AN1, 2=AN0) GPIO = 0 ' initialisation des ports GPIO CMCON = 7 ' comparateurs hors service TRISIO = 0 ' ports GPIO en sortie TRISIO.GPIO2 = 1 ' sauf GP2/AN2 en entrée ADCON0.VCFG = 0 ' Vdd (alim 5V) utilisé comme référence '************************************************************************* ' Boucle d'exécution '************************************************************************* while TRUE ' boucle programme principal mesure = Adc_Read(2) ' lecture AN2 (résultat sur 10 bits) reference = mesure/4 ' réduction de 10 à 8 bits (0 à 255) doublesens (reference) ' sous-programme pilotage double sens for j=1 to 20 ' mesure 1 cycle/20 pour ne pas perturber sortiePWM (amplitude) ' sous-programme commande sortie PWM next j wend end. '************************************************************************* ' Schémas et Commentaires éventuels '*************************************************************************