基於STM32F103的懸掛運動控制系統項目總結

來源:互聯網
上載者:User

1、讓懸掛物體走直線。

2、讓懸掛物體畫圓。

3、在TFT屏上設定座標並讓懸掛物從原點走到該座標。

4、在TFT屏上觸摸一點顯示出該點座標並使懸掛物從原點運動到該座標。

            http://blog.csdn.net/a18716374124/article/details/10372529


for(i=1; i<100; i++)//第一象限
{
now_x1 = x0 + Circle_rx*i;
now_y1 = sqrt( r*r - (Circle_rx*i)*(Circle_rx*i) ) + y0;


Draw_Line( now_x0, now_y0, now_x1, now_y1);
Delay_ms(30);
now_x0 = now_x1;
now_y0 = now_y1;

x = 

y = 

}

其中now_x0 、

在然後就是設定座標,調用STM32開發板光碟片

之後就是第四個,觸屏點的實現,使用TFT屏上面內建的AD

//實現功能:ADS7843啟動
*****************************************************************************/
void start_7843(void)                
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_8);    //TPCLK置低
    GPIO_SetBits(GPIOC, GPIO_Pin_9);      //TPCS置高
    GPIO_SetBits(GPIOA, GPIO_Pin_8);      //TPDI置高
    GPIO_SetBits(GPIOC, GPIO_Pin_8);      //TPCLK置高
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);    //TPCS置低
}
/*****************************************************************************
//實現功能:寫8位命令到觸摸控制IC
//輸入參數:  temp 需要寫入的8位控制命令
*****************************************************************************/
void Write_7843(uchar temp)                         //SPI寫8位命令到觸摸控制IC
{
uchar i=0;

for(i=0;i<8;i++)                                    //迴圈8次寫入一位元組
{
   if(temp&0x80)
GPIO_SetBits(GPIOA, GPIO_Pin_8);      //TPDI置高
else 
GPIO_ResetBits(GPIOA, GPIO_Pin_8);    //判斷最高位是否為1,為1則向資料位元寫1
GPIO_ResetBits(GPIOC, GPIO_Pin_8); 
delay(1);                //送一個脈衝,上升沿有效,將DIN位元據送入到IC
GPIO_SetBits(GPIOC, GPIO_Pin_8); 
delay(1);                
temp<<=1;                           //待寫資料左移1位,準備好寫下一位元據
}
}

/*****************************************************************************
//實現功能:從觸摸控制IC讀8位元據到控制器
//返回參數:  temp 需要寫入的8位控制命令
*****************************************************************************/
uint Read_7843(void)                          //SPI 讀資料
{
uchar i=0;
uint temp=0;


for(i=0;i<12;i++)                         //迴圈12次讀取12位結果

       temp<<=1;                                  //temp左移一位,準備讀取下一位
  GPIO_SetBits(GPIOC, GPIO_Pin_8);  
  delay(1);                      //下降沿有效
  GPIO_ResetBits(GPIOC, GPIO_Pin_8);  
  delay(1);
  if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)) 
  temp++;                    //判斷控制IC送出的一位元據是否為1,如果為1,賦給temp的最低位
     }
    return(temp);                                 //返回結果
}


/*****************************************************************************
//實現功能:讀取觸摸點X軸和Y軸電壓值
//返回參數:pix 讀取到的觸摸點電壓值
*****************************************************************************/
struct struct1 AD7843()            
{
struct struct1 pix;
GPIO_ResetBits(GPIOC, GPIO_Pin_9);

Write_7843(0x90);                 //送控制字 10010000 即用差分方式讀X座標,詳細請見有關資料
GPIO_SetBits(GPIOC, GPIO_Pin_8); 
delay(1); 
GPIO_ResetBits(GPIOC, GPIO_Pin_8); 
delay(1); 
pix.y=Read_7843();


Write_7843(0xD0);                 //送控制字 11010000 即用差分方式讀Y座標 詳細請見有關資料
GPIO_SetBits(GPIOC, GPIO_Pin_8); 
delay(1); 
GPIO_ResetBits(GPIOC, GPIO_Pin_8); 
delay(1); 
pix.x=Read_7843();

GPIO_SetBits(GPIOC, GPIO_Pin_9); 
return pix;
}
/*****************************************************************************
//實現功能:軟體濾波,濾掉波動過大的採樣點
//返回參數:flag 採集資料是否有效標誌,flag=1;則資料有效
*****************************************************************************/
uchar pix_filter(struct struct1 pix1,struct struct1 pix2)
{
uchar flag=0;
int x=pix1.x>pix2.x?pix1.x-pix2.x:pix2.x-pix1.x;  //X軸兩次採樣絕對值
int y=pix1.y>pix2.y?pix1.y-pix2.y:pix2.y-pix1.y;  //Y軸兩次採樣絕對值
if(x<10&&y<10)                                 //軟體濾波,2次取樣的值相差太大的視為雜訊
{
flag=1;
coordinate.x=(pix1.x+pix2.x)/2;                 //求兩次採樣平均值
coordinate.y=(pix1.y+pix2.y)/2;
}
return flag;
}


/*****************************************************************************
//實現功能:讀取採集結果,兩次取均值
*****************************************************************************/
uchar Getpix(void) //取採樣值,此處使用軟體濾波,2次取樣的值相差太大的視為雜訊
{
    uchar flag=0;
    struct struct1 pix1;
    struct struct1 pix2; 
    if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==0)
{  
      pix1=AD7843();
        pix2=AD7843();


if(pix_filter(pix1,pix2)==1) //得到當前TP的取樣值,此處使用軟體濾波,2次取樣的值相差太大的視為雜訊
{
                  if((coordinate.x>Xmin)&&(coordinate.y>Ymin))
                   {
 lx=(uint)(240.0*(coordinate.x-Xmin)/(Xmax-Xmin));   //座標轉換,即根據採樣值計算實際座標值
ly=(uint)(320.0*(coordinate.y-Ymin)/(Ymax-Ymin));   //Xmin、max和Ymin、Ymax分別是觸控螢幕橫縱座標的最小/最大值
flag=1;
                   }

}
return flag;
}    


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.