PixelAverageVoltageError = TargetPixelAverageVoltage - PixelAverageVoltage; if(PixelAverageVoltageError < -TargetPixelAverageVoltageAllowError) {
PixelAverageVoltageError = 0- PixelAverageVoltageError ; PixelAverageVoltageError /= 2; if(PixelAverageVoltageError > 10 ) PixelAverageVoltageError = 10 ;
IntegrationTime -= PixelAverageVoltageError; }
if(PixelAverageVoltageError > TargetPixelAverageVoltageAllowError) {
PixelAverageVoltageError /= 2; if(PixelAverageVoltageError > 10 ) PixelAverageVoltageError = 10 ;
IntegrationTime += PixelAverageVoltageError;}
// uart_putchar(UART0,0XAA) ;
// uart_putchar(UART0,PixelAverageVoltage) ; // uart_putchar(UART0,PixelAverageVoltageError) ; // uart_putchar(UART0,IntegrationTime) ; if(IntegrationTime <= 1) IntegrationTime = 1; if(IntegrationTime >= 100) IntegrationTime = 100; }
2、 线性CCD数据处理模块
数据处理模块实现的功能是读取线性CCD采集的128个点的数据,并且根据数据找到两个凹槽的中点的位置。本系统采用从中间往两边找的方法,先计算128个数据的平均值,再从第64个点往两边找,一直找到连续比平均值都小的第五个点,并且将他们作为两个凹槽的位置,这两个凹槽的位置的中间就是中点N。
u8 caiji() {
u8 n,i,average; u16 sum;
for(i = 0, sum = 0; i < 128; i++) {
sum = sum + Pixel[i]; }
average = sum / 128; for(i = 64; i > 0; i--) {
if(Pixel[i] < average) {
if(Pixel[i+1] < average) {
if(Pixel[i+2] < average) {
if(Pixel[i+3] < average) {
if(Pixel[i+4] < average) {
min1 = i + 2; break; } }
} } } }
for(i = 65; i < 128; i++) {
if(Pixel[i] < average) {
if(Pixel[i-1] < average) {
if(Pixel[i-2] < average) {
if(Pixel[i-3] < average) {
if(Pixel[i-4] < average) {
min2 = i - 2; break; } } } } } }
n = (min1 + min2) / 2; return n; } 3、 舵机模块
舵机模块根据返回的中点位置来打角度,控制小车将要运行的方向。 if(zhongdian > 64)
{
duoji = 25 * (zhongdian - 64); turn_right(); } else {
duoji = 25 * (64 - zhongdian); turn_left(); }
//else turn_right } 4、 液晶模块
液晶模块用来显示一些与系统有关的一些的参数。 void SHOW(void)//显示LCD {
byte txt[16]=\
sprintf((char*)txt,\ LCD_P6x8Str(31,3,txt);
sprintf((char*)txt,\ LCD_P6x8Str(31,4,txt);
sprintf((char*)txt,\ LCD_P6x8Str(31,5,txt); }
参考文献
[1] 野火. 三天入门 Cortex-M4 —Kinetis 系列[M]. 野火嵌入式开发工作室,2002,23~26.
[2]卓晴,黄开胜,邵贝贝等.学做智能车----挑战“飞思卡尔”.北京航空航天大学出版社.