【CW32】具有发电功能的储能小车
简介
基于武汉芯源CW32F030C8T6最小系统的2021年全国大学生电子设计竞赛I题发电功能的蓄能小车
简介:基于武汉芯源CW32F030C8T6最小系统的2021年全国大学生电子设计竞赛I题发电功能的蓄能小车开源协议
:GPL 3.0
描述
题目要求
分界线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1.1题目分析
1.1.1题目重点考察发电的一个利用效率,怎么发更多的电,用的更少,所以我
发电部分设计采用有刷电机,由实验得,发电机额定发电电压为10V,
经查阅资料超级电容充电电压不得超出额定电压的5%(电容限制最低电压:10.5V),
因此我们选择将4枚2.7V超级电容串联为10.8V超级电容作为本设计的储能元件。
由于单片机控制系统工作电压为5V,超级电容输出选择高效率的DC-DC降压模块给单片机和行走电机进行降压。
驱动部分设计采用有刷减速电机,额定功率1W,额定转速100RPM。
1.1.2本次设计将发电和驱动分为两部分分别进行,功能独立。这样我们电源的利用效率就非常高,能走更远的距离,实测行走可以走十米。
1.1.3检测电路采用在同等精度下功耗更低的电容式接近传感器,及红外对射循迹模块,
同时因为在测试过程中,部分传感器仅在短时间需要工作,在本项目中,针对性设计了检测完成后完全断电的电路系统,避免了传感器在不工作的状态下继续耗电的情况
上图为整个系统的框架图
主要分为6个部分,首先由发电电机发电给法拉电容,再由电容升降压给主控和传感器以及电机,这里为什么用升降压呢,因为当电容电压低于5V时,就会自动开启升压模式,把电容榨干到1V,这样我们可以把能量完全利用起来,由于金属探测器比较耗电
所以我们采用了控制三极管,在基本部分的时候断开供电,发挥部分开始供电。3
原理图设计说明
2.1 CW32主控
CW主控采用CW32F030C8T6最小系统开发板,最高主频64MHz, 64K 字节FLASH,数据保持25年,8K 字节RAM,支持奇偶校验128字节OTP存储器,五通道DMA控制器,完全超越STM32,在航天航空以及国防军事方面有广泛的应用,
性价比超高,同时可以免费申请开发板。2021年是CW成立20周年,也是芯源半导体加速高质量发展的一年,更是实现上市公司从代理分销转型为芯片设计与代理分销并举的双核心战略重大转折的一年。未来,公司将继续稳健前行,在芯片研发领域做专做强,积极响应和落实国家对芯片行业国产替代的伟大战略。
CW32生态社区:
微信公众号搜索:"CW32生态社区"-->点击关注,即可免费申请开发板以及芯片,各位小伙伴们,发挥自己的创造力和想象力,一起加油,助推CW32的发展和开发吧!!!
2.2 法拉电容组电路
上图为小车法拉电容电路,为4个电容串联,在接电机端带有指示灯,为基本部分第一问的要求,当电机发电时,指示灯会点亮。二极管的作用为单向导通,防止发出来的电又放回去,SS54的电流最大为5安,耐压为40v,完全符合我们放电电机的参数。接的100nf电容为去耦电容,有刷电机发电时会有高频噪声灌入整个系统,所以接100nf可以降低噪声。
上图为小车的储能电容
上图为小车的发电电机
2.3 电机驱动电路
上图为电机驱动电路,采用NPN加PNP驱动电路,因为题目只需要我们电机前进,所以我们电机只需要一个方向旋转,二极管的作用是续流,因为电机停止转动的时候会有反向电动势,防止烧毁单片机。当MOTO脚为高电平时,Q7导通,Q6导通,电机运行,当MOTO为低电平的时候,Q7截止,Q6截止,电机停止运行。
上图为行走的电机,功耗极低
2.4 金属传感器接口电路
上图为金属传感器,当检测到金属时,Q4导通,JC1的电平为3.3V,当没有金属时,Q4截止,JC1为低电平。POWER2为控制传感器的电源,防止在基本部分时浪费电源。
上图为小车所用的金属传感器,供电为5V
2.5 电源电路
上图为电源电路,由一个MT3608升压芯片和MT2492降压芯片组成,输出二极管的作用为防止灌流,在高于5V的输入电压时,降压电路工作,输出5V电源给单片机,当电压低于5V时,MT3608工作,升压到5V给给整个系统。这两个芯片的效率都是在95%以上,非常的省电,适合我们发电小车的项目。
2.6 外接电路
上图为外接电路,接入循迹传感器以及OLED显示屏
PCB设计说明
上图为PCB的设计图,在设计PCB的时候我们要注意电容部分需要单独一个部分布局,不可以和低压部分接触,防止烧毁单片机,同时不可以覆铜。
软件说明
程序为三个部分,第一个是中断,第二个是控制小车电机的主函数,第三个是OLED显示屏的函数
void main()
{
int main()
{
unsigned int key_1=0,i=0;
RCC_Configuration(); //系统时钟配置为64M
GPIO_Configuration(); //LED&KEY初始化
ATIMER_init();
track_gpio_config();
I2C_Configuration(); //OLED init
OLED_Init();
OLED_CLS();//清屏
while(1)
{
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_14)==GPIO_Pin_SET)key_1=0; //下降沿检测 对应中间按键
else if(key_1==0)
{
for(i=0;i<2000;i++); //消抖
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_14)==GPIO_Pin_RESET)
{ key_1=1;fache=1;}
}
Black_Line_Detection();
if(fache==1)
{
if(XJ03==Black_Line_Found)
{
ATIM_SetCompare1A(40); //控制小车速度 右轮
ATIM_SetCompare2A(40); //控制小车速度 左轮
}
else if(XJ02==Black_Line_Found)
{
ATIM_SetCompare1A(40); //控制小车速度 右轮
ATIM_SetCompare2A(0); //控制小车速度 左轮
}
else if(XJ04==Black_Line_Found)
{
ATIM_SetCompare1A(0); //控制小车速度 右轮
ATIM_SetCompare2A(40); //控制小车速度 左轮
}
else
{
ATIM_SetCompare1A(40); //控制小车速度 右轮
ATIM_SetCompare2A(0); //控制小车速度 左轮
}
}
OLED_ShowCN(0,0, 0); //硬
OLED_ShowCN(18,0, 1); //币
OLED_ShowCN(36,0, 2); //币
OLED_ShowCN(100,0, 3); //币
count_flag++;
if(count_flag>=500)
{
count++;
count_flag=0;
}
if(count>=3)
{
count=3;
}
sprintf(temp_buff,"%d",count); //显示个数
OLED_ShowStr(75,0,temp_buff,2);
}
}
void RCC_Configuration(void)
{
/* 0. HSI使能并校准 */
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
/* 1. 设置HCLK和PCLK的分频系数 */
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
/* 2. 使能PLL,通过PLL倍频到64MHz */
RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, 8); // HSI 默认输出频率8MHz
// RCC_PLL_OUT(); //PC13脚输出PLL时钟
///< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle
///< 当使用的时钟源HCLK大于48MHz:设置FLASH 读等待周期为3 cycle
__RCC_FLASH_CLK_ENABLE();
FLASH_SetLatency(FLASH_Latency_3);
/* 3. 时钟切换到PLL */
RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
RCC_SystemCoreClockUpdate(64000000);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_GPIOA_CLK_ENABLE();
__RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.IT = GPIO_IT_NONE; //KEY1 PB14作按键
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_InitStruct.Pins = GPIO_PIN_14;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.IT = GPIO_IT_NONE; //LED1 LED2
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_7|GPIO_PIN_8;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
GPIO_WritePin(CW_GPIOA, GPIO_PIN_7|GPIO_PIN_8,GPIO_Pin_SET);
}
void ATIMER_init(void)
{
ATIM_InitTypeDef ATIM_InitStruct;
ATIM_OCInitTypeDef ATIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_ATIM_CLK_ENABLE();
__RCC_GPIOA_CLK_ENABLE();
PA08_AFx_ATIMCH1A();
PA09_AFx_ATIMCH2A();
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
ATIM_InitStruct.BufferState = DISABLE; //时基单元配置
ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;
ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;
ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;
ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;
ATIM_InitStruct.OverFlowMask = DISABLE;
ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV32; // 计算时钟1MHz
ATIM_InitStruct.ReloadValue = 100; // 20K
ATIM_InitStruct.RepetitionCounter = 0;
ATIM_InitStruct.UnderFlowMask = DISABLE;
ATIM_Init(&ATIM_InitStruct);
ATIM_OCInitStruct.BufferState = DISABLE;
ATIM_OCInitStruct.OCDMAState = DISABLE;
ATIM_OCInitStruct.OCInterruptSelect = ATIM_OC_IT_UP_COUNTER;
ATIM_OCInitStruct.OCInterruptState = ENABLE;
ATIM_OCInitStruct.OCMode = ATIM_OCMODE_PWM1;
ATIM_OCInitStruct.OCPolarity = ATIM_OCPOLARITY_NONINVERT;
ATIM_OC1AInit(&ATIM_OCInitStruct);
ATIM_OC2AInit(&ATIM_OCInitStruct);
ATIM_SetCompare1A(0);
ATIM_SetCompare2A(0);
ATIM_PWMOutputConfig(OCREFA_TYPE_SINGLE, OUTPUT_TYPE_COMP, 0);
ATIM_CtrlPWMOutputs(ENABLE);
ATIM_Cmd(ENABLE);
}
void ATIM_IRQHandler(void)
{
if (ATIM_GetITStatus(ATIM_IT_OVF))
{
ATIM_ClearITPendingBit(ATIM_IT_OVF);
}
}
printf(""/n);
}
实物展示说明
注意事项
发电的时候会有阻力,我们得用全力,但是也要小心电机齿轮磨损,在推电机发电的时候得匀速前进。
演示视频
提示:演示视频上传附件即可,附件最大只能长传50M的文件,大于50M的文件可放置在其他网盘或视频网站上,只需把地址链接放入这里即可
评论