Dernière mise à jour le 13/03/16

Présentation


Le montage électronique présenté dans cette article, est de pouvoir communiquer entre un ordinateur et le PIC 18F4550 en utilisant la modulation de largeur d’impulsion interne au PIC. L’interface sera programmé en C# à l’aide du logiciel Visual Studio afin de modifier la largeur d’impulsion qui sera envoyé directement au PIC, puis en ce qui concerne la partie programmation du PIC qui traite les données venant de l’interface sera programmé en MikroPascal. L’ensemble de la programmation permettra de faire clignoter une petite led rouge et la luminosité variera en fonction de la largeur d’impulsion (PWM).

Schéma


Contrôleur PWM HIDUSB 001

Alimentation


Régulateur interne


L’alimentation du PIC 18F4550 est faite par l’intermédiaire du port USB de l’ordinateur qui fourni en permanence les 5Vdc. Ensuite  afin d’alimenter le full speed il faut disposer d’une alimentation de 3,3v et pas au dessus!! Nous avons un régulateur interne qui lui génère cette tension il est nommé Vusb alors pourquoi sans priver!!
Ah!! j’allais oublier de vous le dire, il faudra bien penser à activer le régulateur interne dans le logiciel pour qu’il fonctionne.


Vusb

(Clique pour agrandir)


Fonctionnement
Les informations venant du port USB qui sont pilotés par l’interface permettent de contrôler la largeur d’impulsions, puis, cette largeur d’impulsion est réglable via le curseur situé sur l’interface qui lui varie de 0 jusqu’à 10. La capture d’écran ci-dessous montre que le curseur récupère la valeur situé dans le Buffer n°3


Buffer

Programmation de l’interface


Je pense que nous arrivons dans le passage le plus attendu, la programmation de l’interface en C#. Avant d’écrire des lignes et des lignes de codes, il faut avant tout se tourner vers le driver de notre port USB, évidement sans le driver difficile de piloter notre PIC. Je vous laisse le récupérer en cliquant sur le lien usbhiddriver

Programmation C# (Visual Studio)



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using USBHIDDRIVER; // à placer dans Visual Studio en c#
namespace Controleur_PWM_UsbHid_001
{
    public partial class Form1 : Form
    {
        USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_1234", "pid_0001");
        public Form1()
        {
            InitializeComponent();
            usb.enableUsbBufferEvent(new System.EventHandler(myEventCatcher));
         }
        public void myEventCatcher(object sender, System.EventArgs e)
        {
            if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
            {
                byte[] currentRecord = null;
                int counter = 0;
                while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
                {
                    lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                    {
                        USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                    }
                }
                currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
                lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                {
                    USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                }
                usb.stopRead();
            }
        }
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            byte[] Buffer = new byte[64];

            int iValueRectify = trackBar1.Value; //on met les valeurs du trackbar1 dans un entier

            byte[] bytesOut = BitConverter.GetBytes(iValueRectify); // converti la valeur rectifiée en Byte

            for (int i = 0; i<9; i++) // la boucle compte jusqu'à 9 cela correspond à 10 bytes (0..9)
            {
                Buffer[i] = Convert.ToByte(iValueRectify); // les 10 sorties sont activées à tours de rôles grâce à l'incrémentation de "i" 
                textBox1.Text = "Buffer["+trackBar1.Value.ToString()+"]"; // on affiche la valeur du trackbar qui correspond au Buffer
            }

            if (usb.write(Buffer)) // écriture dans le Buffer
            {

            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

Logiciel du PIC


Avec un compilateur, il suffit d’écrire ces lignes de codes en MikroPascal et de les compiler dans le PIC 18F4550

program Controleur_PWM_UsbHid_001;

 var
 ReadBuff: array[64] of byte; absolute 0x500;
 WriteBuff: array[64] of byte; absolute 0x500;
 i:byte;

  procedure Main_Init;
   begin
    TRISA:=%00000001;
    TRISB:=%00000000;
    TRISC:=%00000000;
    CMCON:=$07;
    LATA:=$00;
    LATB:=$00;
    ADCON0.ADON:=0; // on désactive la conversion analogique /numérique (A/D)  
    ADCON1.PCFG0:=1; //
    ADCON1.PCFG1:=1; // | Configurations de toutes les entrées
    ADCON1.PCFG2:=1; // | en numérique (D)
    ADCON1.PCFG3:=1; // | ...
    PWM1_Init(1500); // | ...
    PWM1_Start;
  end;

  procedure Interrupt;
   begin
    USB_Interrupt_Proc;
   end;

  procedure Read_PWM;
   begin
    if (HID_Read()<>0) then
     begin
      if (ReadBuff[0]=0) then PWM1_Set_Duty(25);
      if (ReadBuff[1]=1) then PWM1_Set_Duty(50);
      if (ReadBuff[2]=2) then PWM1_Set_Duty(75);
      if (ReadBuff[3]=3) then PWM1_Set_Duty(100);
      if (ReadBuff[4]=4) then PWM1_Set_Duty(125);
      if (ReadBuff[5]=5) then PWM1_Set_Duty(150);
      if (ReadBuff[6]=6) then PWM1_Set_Duty(175);
      if (ReadBuff[7]=7) then PWM1_Set_Duty(200);
      if (ReadBuff[8]=8) then PWM1_Set_Duty(225);
      if (ReadBuff[9]=9) then PWM1_Set_Duty(250);
    end;
  end;

  Begin
   Main_Init;
   HID_Enable(@Readbuff,@WriteBuff);
   for i:=0 to 63 do
     While true do
      begin
       Read_PWM;
     end;
  end. 


Là encore je vous laisser décoder.

Prototype



Proto_1 Proto_2


Proto_3 Proto_4

Historiques


13/03/16
– Attention!! sur le schéma les quartz n’est pas représenté, entre les broches 13 et 14 !!
11/03/2013
– 1er mise à disposition