自启动方案
本程序仅涉及电动小车的自启动方案,不涉及其它功能。
思路
利用一个单独的单片机控制一个LED灯,LED灯的亮灭由题目给定的时间控制,当时间到达时,LED灯熄灭。电动小车上装有光敏传感器,一旦发现LED灯熄灭,即可启动。
题目
一、任务
设计并制作一个无线充电电动小车及无线充电系统,电动小车可采用成品车 改制,全车重量不小于 250 g,外形尺寸不大于 30cm×26cm,圆形无线充电装置 发射线圈外径不大于 20cm。无线充电装置的接收线圈安装在小车底盘上,仅采用 超级电容(法拉电容)作为小车储能、充电元件。
二、要求
- 基本要求
(1) 小车能通过声或光显示是否处在充电状态。
(2) 小车放置在 A 点,接通电源充电,60 秒时断开电源,小车检测到发射线 圈停止工作自行起动,沿引导线行驶至 B 点并自动停车。
(3) 小车放置在 A 点,接通电源充电,60 秒时断开电源,小车检测到发射线 圈停止工作自行起动,沿引导线行驶直至停车(行驶期间,4 个发射线 圈均不工作),测量小车行驶距离 L1,L1 越大越好。 - 发挥部分
(1) 小车放置在 A 点,接通电源充电并开始计时;60 秒时,小车自行起动 (小车超过 60 秒起动按超时时间扣分),沿引导线单向不停顿行驶直至 停车(沿途由 4 个发射线圈轮流动态充电);180 秒时,如小车仍在行驶, 则断开电源,直至停车。测量小车行驶距离 L2,计算 L=L2-L1,L 越大越 好。
(2) 在发挥部分(1)测试中,测量直流稳压电源在小车开始充电到停驶时间 段内输出的电能 W,计算 K= L2/W,K 越大越好。
(3) 其他。
#include "driverlib.h"
#define KEY1 GPIO_getInputPinValue( GPIO_PORT_P2, GPIO_PIN1)
#define GPIO1 GPIO_getInputPinValue( GPIO_PORT_P3, GPIO_PIN0)
#define GPIO2 GPIO_getInputPinValue( GPIO_PORT_P3, GPIO_PIN1)
/*
#include "msp430f5529.h"
#define CPU_F ((double)25000000)
int count=0;
void Time_Init(void)
{
TA1CTL=TACLR+TAIE+MC_1+TASSEL_1;//3W2768HZ
TA1CCR0=32767;
_EINT();
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer1_A1(void)
{
switch(TA1IV)
{
case TA1IV_TACCR1:break;
case TA1IV_TACCR2:break;
case TA1IV_TAIFG:P1OUT^=BIT0;break;
}
}
*/
void Delay_ms(int nr){
for(short i=0;i<nr; i++){
__delay_cycles(8000);
}
}
void Delay_s(int nu)
{
for(int i=0; i<nu; i++)
{
Delay_ms(63);
}
}
void main(void)
{
//Stop watchdog timer
WDT_A_hold(WDT_A_BASE);
//Set P1.0 to output direction
GPIO_setAsOutputPin( GPIO_PORT_P1, GPIO_PIN0 );
GPIO_setOutputLowOnPin( GPIO_PORT_P1, GPIO_PIN0 );//灭灯
// //Set P1.4 to input direction
// GPIO_setOutputHighOnPin(
// GPIO_PORT_P2,
// GPIO_PIN1
// );
//GPIO_setAsInputPinWithPullUpresistor(GPIO_PORT_P2, GPIO_PIN1);
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P3, GPIO_PIN0);
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P3, GPIO_PIN1);
while(1)
{
if(GPIO1) //常亮1x
{
GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 );
break;
}
else //非常亮
{
if(GPIO2)//直接60s 01
{
GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 );//亮灯
Delay_s(125);//本来应该是60,不知为何120,实际时间57s
GPIO_setOutputLowOnPin( GPIO_PORT_P1, GPIO_PIN0 );//灭灯
break;
}
else//按键按下后60s 00
{
while(1)//按键管脚默认高电平
{
if(KEY1==0)//按下
{
Delay_ms(10);
while(KEY1 == 0);//没松开
break;
}
}
GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 );//亮灯
Delay_s(125);
GPIO_setOutputLowOnPin( GPIO_PORT_P1, GPIO_PIN0 );//灭灯
// Delay_s(1);
// GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 );//亮灯
break;
}
}
}
while(1);
}
// //Test P1.4
// if(GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue( GPIO_PORT_P2, GPIO_PIN1 ))
// {
//if P1.4 set, set P1.0
// Delay_s(10);
// GPIO_setOutputLowOnPin( GPIO_PORT_P1, GPIO_PIN0 );
// Delay_s(10);
// GPIO_setOutputHighOnPin( GPIO_PORT_P1, GPIO_PIN0 );
// }
// else
// {
//else reset
// }
/*
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0XFF;
P1OUT=0X00;
Time_Init();
while(1)
{
}
*/
————————————————
版权声明:本文为CSDN博主「走南闯北声东击西」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/I_LOVE_MCU/article/details/99238831
————————————————
版权声明:本文为CSDN博主「走南闯北声东击西」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/I_LOVE_MCU/article/details/99238831
硬件篇
小车的硬件循迹电路:
使用光敏电阻,它能够检测外界光线的强弱,外界光线越强光敏电阻的阻值越小,外界光线越弱阻值越大,当红色LED光投射到白色区域和黑色跑道时因为反光率的不同,光敏电阻的阻值会发生明显区别,便于后续电路进行控制。
芯片LM393随时比较着两路光敏电阻的大小,当出现不平衡时(例如一侧压黑色跑道)立即控制一侧电机停转,另一侧电机加速旋转,从而使小车修正方向,恢复到正确的方向上,整个过程是一个闭环控制,因此能快速灵敏地控制。
小车的硬件自启动电路:
上图右边VCC与GND为接收线圈的正负极,用来给电路供电,在充电时间内,二极管正向供电导通,使继电器工作,接收线圈直接供电给超级电容,60s过后当接收线圈停止供电时,继电器停止工作,超级电容直接给小车进行供电,且因为有二极管反向不导通的特性,所有的电全部流入小车,使之进行工作
软件篇
#include "msp430f5529.h"
#include"I2C_OLED.H"
#include"zimo.h"
#define CPU_F ((double)1000000)
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //定义宏,延时
void GO0(void) //oled显示 “准备充电”
{
I2C_OLED_Init();
OLED_P16x16Ch(26,3,32);
OLED_P16x16Ch(46,3,33);
OLED_P16x16Ch(66,3,34);
OLED_P16x16Ch(86,3,35);
}
void GO1(void) //oled显示 “充电完成”
{
I2C_OLED_Init();
OLED_P16x16Ch(26,3,34);
OLED_P16x16Ch(46,3,35);
OLED_P16x16Ch(66,3,36);
OLED_P16x16Ch(86,3,37);
}
void OFF(void) //继电器全断
{
P2OUT&=~BIT3;
P2OUT&=~BIT6;
P8OUT&=~BIT1;
P8OUT&=~BIT2;
}
void ONB(void) //继电器开b
{
P2OUT|=BIT3;
P2OUT&=~BIT6;
P8OUT&=~BIT1;
P8OUT&=~BIT2;
}
void ONA(void) //继电器开a
{
P2OUT&=~BIT3;
P2OUT|=BIT6;
P8OUT&=~BIT1;
P8OUT&=~BIT2;
}
void ONC(void) //继电器开c
{
P2OUT&=~BIT3;
P2OUT&=~BIT6;
P8OUT|=BIT1;
P8OUT&=~BIT2;
}
void OND(void) //继电器开d
{
P2OUT&=~BIT3;
P2OUT&=~BIT6;
P8OUT&=~BIT1;
P8OUT|=BIT2;
}
int main(void)
{
WDTCTL = WDTPW+WDTHOLD; //关闭看门狗
P2DIR|=(BIT0+BIT3+BIT6+BIT5+BIT7); //定义引脚为输出方向
P8DIR|=(BIT1+BIT2);
P1DIR|=BIT6;
P2OUT|=BIT7; //定义引脚为高电平输出
P1OUT|=BIT6;
int a;
a=60;
OLED_CLC(); //oled清屏
GO0();
OFF();
while(P2IN & BIT4); //启动开关被触发
{
P1OUT&=~BIT6; / /蜂鸣器模块响一下
delay_ms(100);
P1OUT|=BIT6;
OLED_CLC();
ONB();
for (a; a>=0; a--) //60s倒计时 同时oled显示时间
{
show_Num(55,3,a,2,30);
delay_ms(1000);
}
OFF();
P1OUT&=~BIT6;
delay_ms(100);
P1OUT|=BIT6;
OLED_CLC();
GO1();
}
while (1)
{
if(P3IN & BIT7); //五个霍尔传感器的检测程序,当有信号时,打开相应的继电器
else{
ONA();
}
if(P1IN & BIT3);
else{
ONB();
}
if(P7IN & BIT4 );
else{
ONC();
}
if(P1IN & BIT4);
else{
ONC();
}
if(P1IN & BIT5);
else{
OND();
}
}
}