2021年1月30日 星期六

自動化元件配線與控制

 陳大道

1/30

pic16f887 pickit3

注意專案資料夾的設立

#include<pic.h>

//#include<pic16f887.h>

main()

{

TRISD0=0;

RD0=1;


}

查表法用陣列存

資料空間指定char 8位元,int 16bit, long int 32bit

全域變數,區域變數

主程式,副程式

#include<pic.h>

//#include<pic16f887.h>

const char LED[8]={1,2,4,8,16,32,64};

char i;

long int j;


main()

{

TRISD=0b00000000;

PORTD=0b00000000;

while(1)

{

for(i=0;i<8;i++)

        {

PORTD=LED[i];

for(j=0;j<98000;j++)

{}

}

}

}

-------------------------------------------------------

pic16f877.h內的宣告

// Register: TRISD

volatile unsigned char           TRISD               @ 0x088;

// bit and bitfield definitions

volatile bit TRISD0              @ ((unsigned)&TRISD*8)+0;

volatile bit TRISD1              @ ((unsigned)&TRISD*8)+1;

volatile bit TRISD2              @ ((unsigned)&TRISD*8)+2;

volatile bit TRISD3              @ ((unsigned)&TRISD*8)+3;

volatile bit TRISD4              @ ((unsigned)&TRISD*8)+4;

volatile bit TRISD5              @ ((unsigned)&TRISD*8)+5;

volatile bit TRISD6              @ ((unsigned)&TRISD*8)+6;

volatile bit TRISD7              @ ((unsigned)&TRISD*8)+7;

#ifndef _LIB_BUILD

volatile union {

    struct {

        unsigned TRISD0              : 1;

        unsigned TRISD1              : 1;

        unsigned TRISD2              : 1;

        unsigned TRISD3              : 1;

        unsigned TRISD4              : 1;

        unsigned TRISD5              : 1;

        unsigned TRISD6              : 1;

        unsigned TRISD7              : 1;

    };

} TRISDbits @ 0x088;

#endif


0206

按鈕有反彈跳,延遲時間


光耦合器要計算電阻值,避免燒掉,二極體0.7v就導通,太大會燒掉,看用交流電或直流

原本伺服驅動器的脈波輸入是5V,
如果要用24V,會經由PULL-HI_S的接點,
會多經過1個1K歐姆的電阻。
會讓流經過LED的電流控制在20mA左右。



如果是外接24V,(不透過PULL-HI_S)也會建議加電阻


#include<pic.h>

#define sw2 RB0

#define sw3 RA4

main()

{

TRISD=0b00000000;

PORTD=0b00000000;

TRISB0=1;

ANS12=0;

TRISA4=1;

int i;

while(1)

{

if(sw2==0)

{

for(i=1;i<1000;i++);

if(sw2==0)RD0=1;

}

else RD0=0;

if(sw3==0)

{

for(i=1;i<1000;i++);

if(sw3==0)RD1=1;

}

else RD1=0;

}

}

#include<pic.h>

#define sw2 RB0

#define sw3 RA4

main()

{

TRISD=0b00000000;

PORTD=0b00000000;

TRISB0=1;

ANS12=0;

TRISA4=1;

disp=0b00000001;

int i;

while(1)

{

if(sw2==0)

{

for(i=1;i<1000;i++);

if(sw2==0)

{

PORTD=disp;

disp=disp<<1;

if(sw2==0)disp=0b00000001;

}

}

else RD0=0;

if(sw3==0)

{

for(i=1;i<1000;i++);

if(sw3==0)RD1=1;

}

else RD1=0;

}

}

229

伺服馬達控制器

絕對位址相對位址












302
電子齒輪比





查表法








0309
plsy ks kp y0 y4


步進角360度/500=0.72

ALTP指令
LD X0
ALTP Y0

按一下X0,Y0=ON,再按一下,Y0=OFF,交替输出


0323

//* LCD exercise

#include <pic.h>   

#include "MID_LCD.h"

const char LCD_Msg1[]="float point disp"; 

char LCD_Msg2[]=      " NUMBER:        "; 

 main()

{

  float data;

    int number;

    OpenLCD();

    LCD_Set_Cursor(0,0);

putrsLCD(LCD_Msg1);

LCD_Set_Cursor(0,1);

putsLCD(LCD_Msg2);

    data=25.67;

    number=(int)(data*100);

    LCD_Set_Cursor(8,1);

    put_Num_LCD(number);

   while(1);

}//main

 Temp_Char_100 = (The_Number - Temp_Char_1000*1000)/100 ;;//取百位數的數字

(The_Number%1000)/100

polling

 for(i=0;i<9;i++);// 取樣時間 20us

    GO_DONE=1;   // GO=1Start A/D convert

共用體宣告

union {

    int ADC_VALUE;

    struct {

         char ADC_L;

         char ADC_H;

       }; 

   }ADC; 


 ADC.ADC_L=ADRESL;

       ADC.ADC_H=ADRESH;

V=(ADC.ADC_VALUE/1023.0)*5.0;

ADC_value=(adh<<8)+ADCL;


++++++++++

// AN1為輸入 T1047IC溫度量測

#include <pic.h>

#include "MID_LCD.h"

// 有關底下詳細設定內容請參考 : pic16f887.h 裡的說明

__CONFIG ( FOSC_HS  & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF &

           BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF ); 

__CONFIG ( BOR4V_BOR40V & WRT_OFF );

const char LCD_Msg1[]="Hi-Tech PICC ADC"; 

const char LCD_Msg2[]="V:      T:      "; 

float V,T;


 int number;

 union {

    int ADC_VALUE;

    struct {

         char ADC_L;

         char ADC_H;

       }; 

   }ADC; 

void main(void)

{

 unsigned char i;

  TRISA1=1;

  ANS1 = 1; // Set RA0 which in ANSEL as AD input pin

  ADFM=1;   //  轉換的10位數字 向右排齊 

  VCFG1 = 0;

  VCFG0 = 0;// Vref+=VDD=5, Vref-=VSS=0;

  ADCS1=1;

  ADCS0=0; // Tad=FOSC/32

  CHS3=0;

  CHS2=0;

  CHS1=0;

  CHS0=1; // CHS3:CHS0=0001, AN1為輸入 T1047IC溫度量測

  ADON=1;

//  ANSEL =0x01;// Set RA0 which in ANSEL as AD input pin

//  ANSEL =0b00000001;

// ADCON1=0b10000000;// Right justified, Vref+ = Vdd, Vref- = Vss 

// ADCON0=0b10000001;// Tad = Fosc/32, Select AN0, A/D on

  OpenLCD();

LCD_Set_Cursor(0,0);

putrsLCD(LCD_Msg1);

LCD_Set_Cursor(0,1);

putrsLCD(LCD_Msg2);

   // ADON=1;    // AD 開始轉換

    for(i=0;i<9;i++);// 取樣時間 20us

    GO_DONE=1;   // GO=1Start A/D convert

    while(1)

   {

 //  while(ADIF==1)  //GO=0 End of convert

if(GO_DONE==0)  //GO=0 End of convert 

      {

  //   ADIF=0;

       ADC.ADC_L=ADRESL;

       ADC.ADC_H=ADRESH;

       V=(ADC.ADC_VALUE/1023.0)*5.0;

        number=V*100;

       LCD_Set_Cursor(2,1);

       put_Num_LCD1(number);

       

       T=(V/3.3)*100.0;

       number=T*100;

       LCD_Set_Cursor(10,1);

       put_Num_LCD1(number);

       GO_DONE=1;   // GO=1Start A/D convert

     }     

  }

}


沒有留言:

張貼留言