USB вольтметр

USB вольтметр своими руками

Д
ля создания USB Вольтметра своими руками устанавливаем на ПК следующие программы:

- PROTON IDE;
- PROTEUS;
- DELPHI 5.

1. Программирование в PROTON IDE.
Запускаем PROTON IDE. Нажимаем на кнопку EasyHid (EasyHid должно быть установлено) (рис.1).


рис. 1

В появившемся окне заполняем поля Company Name и Product Name (рис.2).


рис. 2

Переходим к следующему окну (нажав клавишу NEXT) (рис.3).


рис. 3

З
десь заполняем окна Vendor ID и Product ID (можно оставить как есть, по умолчанию). Нажимаем NEXT, ничего не меняем, снова нажимаем NEXT и переходим на следующую вкладку (рис.4).


рис. 4

Н
а этой вкладке пишем название проекта и указываем путь к сохраненному проекту (1) (рис.4). Выбираем микроконтроллер (2) (рис.4). В данном случае выбираем 18F4550. Выбираем компилятор (3) (рис.4). Программу для ПК будем писать в Delphi. Нажимаем NEXT. Компилируем проект. Нажимаем FINISH. В результате получены скелеты для PROTON (рис.5) в папке PDS и для Delphi в папке Delphi.


рис. 5
 

1

В полученном скелете для PROTON вводим следующие строки кода:
Device = 18F4550

Xtal = 48

Declare Reminders = off 'добавляем строку
 

2

Adin_Res 10 'добавляем строку
         
Adin_Tad FRC 'добавляем строку
         
Adin_Stime 100 'добавляем строку

USB_Descriptor = "USBVoltDESC.inc"
 

3

Dim USBBuffer[USBBufferSizeMax] As Byte
     
Dim USB_BUFFER As String * 20 'добавляем строку
     
Dim AD_RESULT As ADRESL.Word 'добавляем строку
     
Dim VALUE As Word 'добавляем строку
     
Dim H0 As Byte 'добавляем строку
      Dim H1 As Byte 'добавляем строку
      Dim H2 As Byte 'добавляем строку
      Dim H3 As Byte 'добавляем строку
 

4

Symbol CARRY_FLAG = STATUS.0
Symbol TRNIF = UIR.3 'добавляем строку вместо Symbol ATTACHED_STATE = 6

5

Выделяем и удаляем все строки, начиная со строки GoSub AttachToUSB. Вместо удаленных строк пишем следующие строки:

DelayMS 200
    
Clear
Repeat

    
USBPoll
Until PP0 = %00000110

     TRISA.0 = 1
    
ADCON1 = %10000010
    
ADCON2 = %10000000

While 1 = 1

        
          ADCIN 1, AD_RESULT  'ADCIN 1 – подключена нога 3
  
        USBPoll

    
VALUE = AD_RESULT

H3 = VALUE / 1000
H2 = VALUE / 100-H3*10
H1 = VALUE /10-H3*100-H2*10
H0 = VALUE - H3*1000-H2*100-H1*10

USB_BUFFER = Str$(Dec1,H3) + Str$(Dec1,H2) + Str$(Dec1, H1) +Str$(Dec1, H0)

Repeat

USBOut 1, USB_BUFFER, USBBufferSizeTX

    
Until CARRY_FLAG = 0
    
Repeat : Until TRNIF = 1

Wend




Сохраняем проект (1) и компилируем (2) (рис.6).


рис. 6

2. Работа в PROTEUS

Запускаем PROTEUS и собираем схему (рис.7).


рис. 7

 

Дважды щелкаем на МК PIC18F4550 и в окне Program File указываем путь к скомпилированной прошивке (BAS или HEX фаил).

3. Работа в DELPHI.

Запускаем Delphi и загружаем скомпилированный скелет из папки Delphi. Предварительно в эту папку копируем файл mcHID.dll из папки …/ProtonIDE/Plugin/EasyHid. В
загруженный скелет вводим выделенные красным цветом строки кода:

unit FormMain;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

const

// input and out buffer size constants...
BufferInSize = 8;
BufferOutSize = 8;

type

// input and output buffers...
   TBufferIn = array[0..BufferInSize] of byte;
   TBufferOut = array[0..BufferOutSize] of byte;

// main form
TForm1 = class(TForm)
   Label2: TLabel;
   Edit1: TEdit;
   Edit2: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   private
      FBufferIn:TBufferIn;
      FBufferOut:TBufferOut;
      function USBEvent(var Msg: TMessage): Boolean;
   public
   end;

var
   Form1: TForm1;

implementation

uses
   cUSBInterface,
   cUSBInterfaceTypes;

const
// vendor and product ID constants...

VENDOR_ID = 6017;
PRODUCT_ID = 2000;

{$R *.DFM}

{
****************************************************************************
* Name : Create
* Purpose : Create the main form
****************************************************************************
}
procedure TForm1.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(USBEvent);
   Connect(Application.Handle);
end;

{
****************************************************************************
* Name : Destroy
* Purpose : Free the main form
****************************************************************************
}
procedure TForm1.FormDestroy(Sender: TObject);
begin
   Application.UnHookMainWindow(USBEvent);
end;

{
****************************************************************************
* Name : USBEvent
* Purpose : DLL message handler hook
****************************************************************************
}
function TForm1.USBEvent(var Msg: TMessage): Boolean;
var
   DevHandle:cardinal;
   a,b: double;
// TextBuffer:array[0..255] of char;
begin
   result := False;

   if Msg.Msg = WM_HID_EVENT then
   begin
      case Msg.WParam of

   // a HID device has been plugged in...
   NOTIFY_PLUGGED :
   begin
   // is it our HID device...
   DevHandle := Msg.LParam; // handle of HID device in this message

   if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) =PRODUCT_ID) then
   begin
      Label2.Caption:= 'USB
вольтметр сейчас подключен';
      // add your code here, for example...
      // GetProductName(DevHandle, TextBuffer, 256);
      // ALabel.Caption := string(TextBuffer);
   end;

   result := true;

   end;

   // a HID device has been device removed...

   NOTIFY_UNPLUGGED :

   begin
   // is it our HID device...
   DevHandle := Msg.LParam; // handle of HID device in this message
   if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then

   begin
      Label2.Caption:= 'USB
вольтметр сейчас отключен';
   // add you code here
   end;

   result := true;

   end;

   // a HID device has been attached or removed. This event is fired after
   // either NotifyPlugged or NotifyUnplugged.

   NOTIFY_CHANGED :
   begin
      // get the handle of the device we are interested in
      // and set it's read notification flag to true...
      DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID);
      SetReadNotify(DevHandle,true);

   result := true;

   end;

   // a HID device has sent some data..
   NOTIFY_READ :
   begin
      DevHandle := Msg.LParam; // handle of HID device in this message
      if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
      begin
      // read the data - remember that first byte is report ID...
      Read(DevHandle,@FBufferIn);
      Edit1.Text:= String(@FBufferIn[1]);
      a:= StrToFloat(Edit1.Text);
      b:= (5/1024*a)*1.00532;
      Edit2.Text:= FloatToStr(b);

      // process data here...
   end;

   result := true;

   end;

   end;

   end;

end;

end.


4.
Запуск проекта.

Собрав схему в PROTEUS и доработав программу в DELPHI запускаем проект (рис 8):
1. Запускаем схему в PROTEUS (1);
2. Запускаем программу в DELPHI (2 и 3).


рис. 8

В
текстовом окне (2) выводятся значения полученные из собранной схемы. В текстовом окне (3) отображаются значения текстового окна (2) пересчитанные программно в вольты.

5. Монтаж.

После проведения отладки проекта переходим к монтированию рабочей модели. Приобретаем необходимые детали. Паяем наш вольтметр. МК лучше поместить в «кроватку». После того, как рабочая модель вольтметра будет готова, переходим к прошивке МК. Для этого нам понадобится программа IC-Prog 1.06C и программатор, поддерживающий наш МК.

Поместив наш МК в программатор и запустив IC-Prog 1.06C, загружаем в эту программу скомпилированный HEX файл. Для того, чтобы наш вольтметр опознался ПК как HID устройство, необходимо изменить конфиги (рис. 9).


рис. 9

Д
ля этого в окна конфигурации вписываем следующие конфиги, всего их четыре:

Config1 – 0230;
Config2 – 1E3D;
Config3 – 00FF;
Config4 – FF81.

Сохраняем изменения в отдельный файл. Для уверенности, что все сделано правильно, закрываем программу. Загружаем программу снова, и загружаем сохраненный измененный HEX файл. Снова проверяем конфиги. Если все конфиги соответствуют, прошиваем МК. После прошивки помещаем МК в «кроватку» нашего вольтметра.

НЕОБХОДИМО ПОМНИТЬ, ЧТО МАКСИМАЛЬНОЕ ИЗМЕРЯЕМОЕ НАПРЯЖЕНИЕ ДОЛЖНО БЫТЬ НЕ БОЛЕЕ 5 V ПОСТОЯННОГО ТОКА. ФАИЛ mcHID.dll ДОЛЖЕН НАХОДИТЬСЯ В ПАПКЕ С ПРОГРАММОЙ СКОМПИЛИРОВАННОЙ В DELPHI.

При работе в Windows XP необходимо установить драйвера для HID устройств. При работе в Windows 7 эти драйвера не требуются.