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
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.
(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
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)
{
}
}
}
|
Programme 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
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