zoukankan      html  css  js  c++  java
  • 悬挂运动控制系统 源代码 (05年电赛)


    题目连接:05年电赛 悬挂运动控制系统 源代码

    http://wenku.baidu.com/view/b51e3a25ccbff121dd3683bf.html


    系统: 2块STM32   A为上位机 液晶显示 语言提示 摄像头 + NRF 发送目标路径,  所有步进电机等由STM32 B控制。


    下位机 main.c


    #include "main.h"
    #include "math.h"
    #include <stdio.h>
    
    void DrawCircle()
    {
        int x , y;
        Move2XY(15, 50);
        for(x = 15; x <= 65; ++x)
        {
            y = sqrt( 625 - (x - 40)*(x - 40) ) + 50;
            Move2XY(x, y);
        }
        for(x = 65; x >= 15; --x)
        {
            y = 50 - sqrt( 625 - (x - 40)*(x - 40) );
            Move2XY(x, y);
        }
    }
    
    void DrawL()
    {
        int i;
        for(i = 0; i < 100; ++i)
        {
            Move2XY(0, i);
        }
        for(i = 0; i < 80; ++ i)
        {
            Move2XY(i,99);
        }
    }
    
    void DrawPoly()
    {
        int i;
        for(i = 0; i < 100; ++i)
        {
            Move2XY(0, i);
        }
        for(i = 0; i < 80; ++ i)
        {
            Move2XY(i,99);
        }
        for(i = 0; i < 100; ++i)
        {
            Move2XY(79, 100 - i);
        }
        for(i = 0; i < 80; ++ i)
        {
            Move2XY(80 - i,0);
        }
    }
    
    int main(void)
    {
        int i;
    	SystemInit();	
    	GPIO_INIT(); 
        COM1Init(115200);
        DrawPoly();
        //DrawL();
        //
    	while(1)
    	{   
            DrawCircle();
        }
    }
    
    
    
    


    控制引擎


    #include "Contral.h"
    #include "delay.h"
    #include "math.h"
    #include "usart.h"
    #include "stdio.h"
    
    double LeftArm = 115.974, RightArm = 149.164;
    int    NowX = 0, NowY = 0;
    int    StepTim = 10;
    
    int STEP[4] = {0x0011, 0x0014, 0x0044, 0x0041};
    int LSTEPID = 0, RSTEPID = 0;
    
    void GPIO_INIT(void)
    {
      	GPIO_InitTypeDef GPIO_InitStructure;
    
      	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD , ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
      	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6;
      	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      	GPIO_Init(GPIOD, &GPIO_InitStructure);	
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    
    void LeftStepRun(int CTR, int Delay1_4)
    {
        int i = 0;
    
        if(CTR > 0)
        {
            CTR += LSTEPID;
            for(i = LSTEPID; i < CTR; ++i, ++LSTEPID)
            {
                GPIO_Write(GPIOD, STEP[i % 4]);
                delay_ms(Delay1_4);
            }
            if(LSTEPID > 10000) LSTEPID = 0;
        }
        
        //back
        if(CTR < 0)
        {
           CTR = -CTR + LSTEPID;
           for(i = LSTEPID; i < CTR; ++i, ++LSTEPID)
           {
               GPIO_Write(GPIOD, STEP[(4 - (i % 4)) % 4]);
               delay_ms(Delay1_4);
           }
           if(LSTEPID > 10000) LSTEPID = 0;
        }  
    }
    
    void RightStepRun(int CTR, int Delay1_4)
    {
        int i = 0;
        
        //foward
        if(CTR > 0)
        {
            CTR += RSTEPID;
            for(i = RSTEPID; i < CTR; ++i, ++RSTEPID)
            {
                GPIO_Write(GPIOA, STEP[i % 4]);
                delay_ms(Delay1_4);
            }
            if(RSTEPID > 10000) RSTEPID = 0;
        }
        
        //back
        if(CTR < 0)
        {
           CTR = -CTR + RSTEPID;
           for(i = RSTEPID; i < CTR; ++i, ++RSTEPID)
           {
               GPIO_Write(GPIOA, STEP[(4 - (i % 4)) % 4]);
               delay_ms(Delay1_4);
           }
           if(RSTEPID > 10000) RSTEPID = 0;
        }  
    }
    
    
    void Step2XY(int x, int y)
    {
        int i, j;
        int signL = 1, signR = 1;
        double tempLeftArm = 0, tempRightArm = 0;
        double LStepCtr = 0, RStepCtr = 0;
        
        tempLeftArm = sqrt((x + 15)*(x + 15) + (115 - y)*(115 - y));
        LStepCtr = (tempLeftArm - LeftArm) / 0.05813;   
        
        tempRightArm = sqrt((95 - x)*(95 - x) + (115 - y)*(115 - y));
        RStepCtr = (tempRightArm - RightArm) / 0.05813;
        
    //     printf("LStepCtr = %lf  RStepCtr = %lf !!",LStepCtr,RStepCtr );
    //     LeftStepRun(LStepCtr, 10);
    //     RightStepRun(RStepCtr, 10);
    //     printf("x = %d,, y = %d,,LStepCtr = %lf RStepCtr = %lf 
    ", x, y, LStepCtr, RStepCtr);
        i = 0; j = 0;
        if(LStepCtr < 0) LStepCtr = -LStepCtr, signL = -1;
        if(RStepCtr < 0) RStepCtr = -RStepCtr, signR = -1;
        while(i < LStepCtr || j < RStepCtr)
        {
            if(i < LStepCtr) LeftStepRun(signL, StepTim);
            if(j < RStepCtr) RightStepRun(signR, StepTim);
            i++;
            j++;
        }
        
        i = LStepCtr;
        j = RStepCtr;
        if(j != 0)RightArm = tempRightArm;
        if(i != 0)LeftArm = tempLeftArm;
    }
    
    int _abs(int a)
    {
        if(a > 0)  return a;
        else return -a;
    }
    
    int _max(int a, int b)
    {
        if(a > b) return a;
        else return b;
    }
    
    void Move2XY(int x, int y)
    {
        int tempx, tempy, i;
        int xError = x - NowX, yError = y - NowY;
        int MaxError = _max(_abs(xError), _abs(yError));
        
        double xSon = xError*1.0 / MaxError, ySon = yError*1.0 / MaxError;
        
        for(i = 0; i <= MaxError; ++i)
        {
            tempx = NowX + xSon * i;
            tempy = NowY + ySon * i;
            Step2XY(tempx, tempy);
        }  
        NowX = x, NowY = y;
    }
    
    


  • 相关阅读:
    设计模式学习
    rabbitMQ topic实现广播
    rabbitMQ direct实现广播
    rabbitMQ fanout 实现广播
    rabbitMQ 生产者消费者
    python select 实现IO异步
    python gevent 爬虫
    python gevent socket
    python 协程
    python 进程池
  • 原文地址:https://www.cnblogs.com/pangblog/p/3246737.html
Copyright © 2011-2022 走看看