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