飞思卡尔光电直立

本文详细介绍了基于飞思卡尔芯片的直立平衡车设计,包括直立平衡算法、速度环控制和CCD循迹技术。通过加速计和陀螺仪采集数据,结合水平和垂直加速度计算角度,实现稳定直立。同时,阐述了CCD采样和处理流程,用于精确跟踪赛道中线。
摘要由CSDN通过智能技术生成

1、直立平衡车包括,直立还,速度环,和CCD循迹设计。
2、直立环,采用加速计采集加速度,陀螺仪采集角速度
3、车在直立摆动的过程中会有一个水平的加速度我们记为a
有一个垂直的重力加速度 我们记为 g
那么这个水平的加速度和垂直的重力加速度g 就会形成一个夹角
定时器产生中断,第1毫秒进行加速剂陀螺仪AD采样,第2毫秒进行角度融合,PWM控制输出,第3毫秒进行直立速度融合,第4ms进行CCD循迹方向控制。
/*************************************************
Copyright:Electronic innovation laboratory
Author:niub
Date:2016-12-21
Version:V1.2
Description: the software of Freescale Carle photoelectric vertical design

**************************************************/

#include "includes.h"
#include "math.h"
#include "HAL_GPIO.h"

#define STATIC_ADC_RESULT_X 0//390
#define STATIC_ADC_RESULT_Y 0//408
//函数声明
void init_gpio(void);//小灯初始化
void init_offset(); //开机初始化
void bianmaqi(void);//编码器函数声明
void SpeedControl(void);//速度控制
void SpeedControlOutput(void);//速度平滑输出
void DirectionControl();//方向控制
void DirectionControlOutput();//方向控制平滑输出
void MotorOutput() ;//电机输出函数声明
 extern uint8 IntegrationTime ;        //曝光时间
 extern void StartIntegration(void);     //曝光函数
/*********************************************************************************/
 void delay(void);
int16 adc_get_ave(ADCx, uint8, uint16);//函数声明
int16 adc_result_to_velocity(int16);//函数声明
float pwm1,pwm2;
float P;
float d;
/*********************CCD的参数定义********************************/
uint8 AtemP ;
uint8 Pixel[128];
uint8 send_data_cnt = 0;
uint8 *pixel_pt;
volatile uint8 k;
uint8 TIME0flag_5ms;//时间标志位
uint8 TIME0flag_10ms;
uint8 TIME0flag_15ms;
uint8 TIME0flag_20ms;
uint8 TIME1flag_20ms;
uint8 TIME1flag_1ms;
extern uint8 TimerFlag20ms;
/* 曝光时间,单位ms */
//unsigned char IntegrationTime = 10;
/******************************************************/
 int count2=0;	//不同中断片段
 
void  main(void)
{
  sysinit ();//时钟初始化
  init_gpio();//IO口初始化
  LPLD_ADC_Init(ADC0, MODE_10, CONV_SING);
  void LCD_Init(void);//液晶5110初始化
  delay();
  LPLD_PIT_Init(PIT0, 1000, pit_isr0);//进入中断

  LPLD_FTM0_PWM_Init(10000);//pwm初始化
  LPLD_FTM1_PWM_Init(100);//此通道专用于舵机控制
  LPLD_FTM1_PWM_Open(0,0);//PTA8
  LPLD_FTM0_PWM_Open(0,0);//PTC1  
  LPLD_FTM0_PWM_Open(1,0);//PTC2  
  LPLD_FTM0_PWM_Open(2,0);//PTC3
  LPLD_FTM0_PWM_Open(3,0);//PTC4 
  FTM1_QUAD_Iint(); //正交解码初始化  用于编码器
  FTM2_QUAD_Iint(); //正交解码初始化  用于编码器
CCD_init1();//CCD初始化
 pixel_pt = Pixel;//指针指向数组,将数组全部清零
  for(k=0; k<128+10; k++) 
  {
    *pixel_pt++ = 0;
  }
  
  while(1)
  {
      /**************************CCD程序**发送给上位机***************************************************************/  
     if(TIME1flag_20ms == 1)
      {
        TIME1flag_20ms = 0 ; 
        /* Sampling CCD data */
      ImageCapture(Pixel);
        /* Calculate Integration Time */
      CalculateIntegrationTime();
      if(++send_data_cnt >= 5) 
       {
         send_data_cnt = 0;
       SendImageData(Pixel);
        }
        /**********
        计算黑线位置
        **********/
           CCD_handle(); //CCD处理。。。
  
       Delay_us(100000); // Delay_us(100000);可以显示 有点闪
     
      LCD_clear();	
     Delay_us(100000); // Delay_us(100000);可以显示  有点闪
     LCD_write_english_string(24,0,"LANDZO");  
     LCD_write_english_string(24,1,"tangwenkai"); 
      
    //LCD_Write_Num(0,0,a,4);
    //LCD_Write_Num(0,1,b,4);
    //LCD_Write_Num(0,2,s2,4); 
     
      printf
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo-niuben

你的鼓励是我创作的巨大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值