[应用相关] 通用电动车行驶状态监测仪

[复制链接]
1277|5
 楼主| dentsgot 发表于 2016-7-20 14:43 | 显示全部楼层 |阅读模式
转载
采用了STM32F0 Discovery探索板作为控制核心,实现通用电动车在行驶过程中的速度检测、行驶里程的计算以及电动车电瓶的剩余电量值,并根据剩余电量值预报电动车的剩余行驶里程,然后通过人机交互界面进行参数的实时显示。在设计工程中主要完成了电源电路设计,微处理器基本工作电路设计,光电门为传感器的行驶速度和行驶里程检测电路设计,基于A/D转换的电瓶电量检测电路,实时时钟电路设计,按键及TFT LCD液晶显示电路设计。最后,在硬件系统上通过软件编程实现了部分设计的验证。
废话不多说,直接上代码:
系统时钟初始化函数SystemInit();自带的系统初始化函数
  1. void SystemInit (void)
  2. {   
  3.   RCC->CR |= (uint32_t)0x00000001;
  4.   RCC->CFGR &= (uint32_t)0xF8FFB80C;
  5.   RCC->CR &= (uint32_t)0xFEF6FFFF;
  6.   RCC->CR &= (uint32_t)0xFFFBFFFF;
  7.   RCC->CFGR &= (uint32_t)0xFFC0FFFF;
  8.   RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
  9.   RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
  10.   RCC->CR2 &= (uint32_t)0xFFFFFFFE;

  11.   RCC->CIR = 0x00000000;

  12.    SetSysClock();
  13. }
系统延时初始化函数delay_init()(注,移植于正点原子的开发板例程)
  1. void delay_init()         
  2. {
  3.                 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  4.                 fac_us=SystemCoreClock/8000000;      
  5.                 fac_ms=(int16_t)fac_us*1000;
  6. }        


 楼主| dentsgot 发表于 2016-7-20 14:44 | 显示全部楼层
LED灯初始化函数LED_Init()
  1. oid LED_Init()
  2.     {
  3.                   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
  4.                   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  5.                   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  6.                   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  7.                   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.                   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  9.                   GPIO_Init(GPIOC, &GPIO_InitStructure);
  10.                   led_off(LED3|LED4);
  11. }
按键初始化函数KEY_Init(void)
  1. void KEY_Init(void)
  2. {
  3.            GPIO_InitTypeDef GPIO_InitStructure;                                                                       
  4.            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                                                              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
  5.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                       
  6.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;      
  7.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;                              
  8.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                                                                  GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
  9. }


 楼主| dentsgot 发表于 2016-7-20 14:45 | 显示全部楼层
外部中断初始化函数EXTI_KEY_Init(void)
  1. void EXTI_KEY_Init(void)
  2. {
  3.         GPIO_InitTypeDef   GPIO_InitStructure;                                                                                              EXTI_InitTypeDef   EXTI_InitStructure;                                                               
  4.         NVIC_InitTypeDef   NVIC_InitStructure;                                                                  
  5.      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);                                                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;                    
  6.      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                                                                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;                                                  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;                              
  7.      GPIO_Init(GPIOA, &GPIO_InitStructure);                                                               
  8.         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  9.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);                                                      SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);

  10.      EXTI_InitStructure.EXTI_Line = EXTI_Line1;                                                      
  11.      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                                       
  12.      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                       
  13.      EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                                                  EXTI_Init(&EXTI_InitStructure);      
  14.                                                                        
  15.      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;                                                                  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;                                                                       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                      NVIC_Init(&NVIC_InitStructure);                                                                              
  16. }
定时器初始化函数TIM3_Init(void)
  1. void TIM3_Init(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  5.         NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
  6.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  7.         NVIC_Init(&NVIC_InitStructure);                             
  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
  9.         TIM3->SC=47999;
  10.         TIM3->ARR=99;      
  11.         TIM3->DIER|=1=0XFFFFFFF0)
  12.                                 FLASH_Write(FLASH_KM_TEST_ADDR,0);  
  13.                 else
  14.                                 FLASH_Write(FLASH_KM_TEST_ADDR,x);  
  15.                
  16.                 LCD_Init();                       
  17.                               
  18.                 Self_Test();                                       
  19.                 GUI_Init();                 
  20.                 BACK_COLOR=GRAYBLUE;
  21.                
  22.                 km_test=FLASH_Read(FLASH_KM_TEST_ADDR);      
  23.                 while (1)
  24.                 {   
  25.                        
  26.                                 LCD_Show2Num(108, 92,(uint16_t)speed,3,16,0);
  27.                                 LCD_Show2Num(140, 92,(speed-(uint16_t)speed)*100,2,16,0);

  28.                                 km=        ((float)(km_test/8)*2*pi*0.28/1000)/100;
  29.                                 LCD_Show2Num(108,132,(uint16_t)km,4,16,0);
  30.                                 LCD_Show2Num(148,132,(km-(uint16_t)km)*10,1,16,0);
  31.                               
  32.                                 while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET );
  33.                                 DMA_ClearFlag(DMA1_FLAG_TC1);                                                                                                
  34.                                 temp = (float)RegularConvData_Tab[0]*(3.3/4096)*5.12;
  35.                                 battery = temp*6000/12;
  36.                                 LCD_Show2Num(108, 172,(uint16_t)battery,6,16,0);
  37.                                                
  38.                                 remain_km=battery*0.05;
  39.                                 LCD_Show2Num(108, 212,(uint16_t)remain_km,6,16,0);
  40.                               
  41.                                 temp  = (float)RegularConvData_Tab[1]*(3.3/4096);
  42.                                 temperate=(1.43-temp)/0.043+25;
  43.                                 BACK_COLOR=LBBLUE;
  44.                                 LCD_Show2Num(132, 280,(uint8_t)temperate,2,16,0);
  45.                                 LCD_Show2Num(156, 280,(temperate-(uint8_t)temperate)*100,2,16,0);
  46.                                 BACK_COLOR=GRAYBLUE;
  47.                               
  48.                                 i++;
  49.                                 if(i>100)
  50.                                 {
  51.                                                 i=0;F_LED4;
  52.                                                 FLASH_Write(FLASH_KM_TEST_ADDR,km_test);  //
  53.                                 }
  54.                                 delay_ms(10);
  55.     }
  56. }


mmuuss586 发表于 2016-7-20 20:53 | 显示全部楼层
谢谢分享;
天灵灵地灵灵 发表于 2016-7-20 21:39 | 显示全部楼层
可以画个简单的结构图,更清楚。只看代码要费劲点。
yklstudent 发表于 2016-7-20 22:11 | 显示全部楼层
这个不知道显示了电动车哪方面的状态了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

164

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部