该设计是基于90c52单片机的电磁寻迹小车。搭好硬件后(包括两个直流电机,一个万向轮,传感器(电感)及其支架 )。将小车放在通电的导线上传感器与通电导线电磁感应产生电动势,经过放大电路将微弱的信号放大后。再由单片机内部的ad读取数据。分析数据在决定小车的方向.
具体的实现过程如下:
1.假设在小车的左右两端各有1个电感并且经过放大电路后ad采集到的值分别为a和b。
2.电机的运转快慢由定时器产生的pwm信号来控制,假设左右两个电机的初始pwm为20,最高为100。
3.我们知道电势的高低和传感器离通电导线的距离有关,距离越远得到的值越小,反之越高。最理想的状态是小车一直在导线的中间走。也就是两个电感的值相同。此时可以通过所得到的电感值算出小车的一个相对的位置 p=a-b/c 这只是一个最基本的式子具体还要根据自己实际所得的ad值来做调整。根据所得到的这个相对位置的值再来调整左边或者右边电机的pwm值。如果p>大于0,说明左边的电感值大于右边也就是说左边的电感距离通电导线近,就应该左转,反之右转。
4.转弯的方法第一可以保持一边电机的pwm不变降低另一边的pwm的值,第二可以保持一边电机的pwm不变提高另一边的pwm的值
本设计已经过测试确实可行由于时间仓促还有很多地方需要完善,见谅!!
单片机源程序如下:
-
- #include "max7219.h"
- unsigned char dis_code[18]={0x7E,0x30,0x6D,0x79, // 0, 1, 2, 3
- 0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x01,0x00};// 4, 5, 6, 7, 8, 9,a,b,c,d,e,f,-, ,
- void Write_Max7219_byte(unsigned char temp)
- {
- unsigned char i;
- for (i=0;i<8;i++)
- {
- MAX7219_CLK0; // CLK=0;
- if((temp>>7)&0x1)
- {
- MAX7219_DIN1;
- }
- else
- {
- MAX7219_DIN0;
- }
- //DIN=((temp>>7)&0x1);
- temp<<=1;
- MAX7219_CLK1;//CLK=1;
- }
- }
- void Write_Max7219(unsigned char address,unsigned char dat)
- {
- MAX7219_CS0;//MAX_LOAD=0;
- Write_Max7219_byte(address);
- Write_Max7219_byte(dat);
- MAX7219_CS1;//MAX_LOAD=1;
- }
- void clear(void)
- {
- Write_Max7219(1,0x00);
- Write_Max7219(2,0x00);
- Write_Max7219(3,0x00);
- Write_Max7219(4,0x00);
- Write_Max7219(5,0x00);
- Write_Max7219(6,0x00);
- Write_Max7219(7,0x00);
- Write_Max7219(8,0x00);
- }
- //void Max7219_port(void)
- //{
- //
- // GPIO_InitTypeDef GPIO_InitStructure;
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- // GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 ;
- // GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
- // GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- // GPIO_Init(GPIOB,&GPIO_InitStructure);
- //// RCC->APB2ENR|=1<<2;
- ////
- //// GPIOA->CRL&=0X0F00FFFF;
- //// GPIOA->CRL|=0X30330000;//PA2 推挽输出
- //// GPIOA->ODR|=1<<4; //PA2 输出高
- //// GPIOA->ODR|=1<<5; //PA2 输出高
- //// GPIOA->ODR|=1<<7; //PA2 输出高
- ////
- //}
- void Init_Max7219(void)
- {
- Write_Max7219(SHUT_DOWN, 0x00); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
- Write_Max7219(DECODE_MODE, 0x00); //Decode Mode Select D7~D0 1 B decode 0 No decode
- Write_Max7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7
- Write_Max7219(INTENSITY, 0x0A); //Set Intensity 0xX0~0xXf
- Write_Max7219(DISPLAY_TEST, 0x00); //Normal Operation XXXXXXX0 Display Test Mode
- Write_Max7219(SHUT_DOWN, 0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
- clear();
- }
- void TestLED(void)
- {
- Write_Max7219(1,dis_code[0]);
- Write_Max7219(2,dis_code[1]);
- Write_Max7219(3,dis_code[2]);
- Write_Max7219(4,dis_code[3]);
- Write_Max7219(5,dis_code[4]);
- Write_Max7219(6,dis_code[5]);
- Write_Max7219(7,dis_code[6]);
- Write_Max7219(8,dis_code[7]);
- }
- void LED(unsigned char position ,unsigned char Value)
- {
-
- Write_Max7219(position,dis_code[Value]);
- }
- void display(int num,int num1 )
- {
- char temp;
- temp = num/1000;
- LED(8 ,temp);
- temp = num%1000/100;
- LED(7 ,temp);
- temp = num%100/10;
- LED(6 ,temp);
- temp = num%10;
- LED(5 ,temp);
- temp = num1/1000;
- LED(4 ,temp);
- temp = num1%1000/100;
- LED(3 ,temp);
- temp = num1%100/10;
- LED(2 ,temp);
- temp = num1%10;
- LED(1 ,temp);
- }
复制代码
所有资料51hei提供下载:
基于90c52单片机的电磁小车.rar
(127.24 KB, 下载次数: 14)
|