• 汽车辅助系统


    目录

    一,项目描述

    二,项目 功能

    三,代码实现

    (1)倒车雷达

    (2)AD(对 雨滴与光敏电阻传感器进行AD采集)

    (3)雨刷

    (4)灯光

    最后总结:


    一,项目描述

           当前移动互联网、物联网、云计算、大数据、人工智能为代表的信息技术的 运用促进社会向智能化进化,汽车交通领域智能化成为科技发展的必然趋势,车 联网、汽车驾驶辅助系统(ADAS)是汽车领域创新应用的重点。车联网技术是借 助人、车、环境、云平台之间全方位的连接和信息交互,精确感知和预测周边环 境状态,而 ADAS 作为一种实现人工智能驾驶过渡的技术,其原理是借助车辆上 感知层将检测到的车内外的环境信号转换成电信号,并经过数字信号处理完成智 能判断和车辆的自动控制。ADAS 功能的实现通常需要通过摄像头、激光雷达、 毫米波雷达、红外线探头等感知层、决策层和控制层完成信息的采集、分析和自 动驾驶动作的转换;而光学元件作为车载镜头、激光雷达等感知层信息采集的重 要入口,将受益于智能驾驶市场的发展。

    二,项目 功能

    该汽车驾驶辅助系统包含四大功能模块:倒车预警,感应雨刷、 自动大灯、中控显示。

    (1)倒车预警 倒车预警功能是在倒车过程中检测车辆与后方障碍物的距离,实时在中控屏 进行距离显示。且当距离小于安全距离(可以在移动端进行修改)时,发出警报 声予以提示。

    (2)感应雨刷 感应雨刷能够监测前挡风玻璃上是否有水,如果检测到有水,则会自动开启 雨刷,并且会根据雨水量的大小来相应改变雨刷的档位,即雨刷刷动频率。

    (4)自动大灯 自动大灯功能能够实时监测行车环境光线的强弱,当检测到光照强度较弱时, 能够自动开启车灯;反之,当光照强度较强时会自动关闭大灯。

    (5)中控显示。 中控显示指将其他辅助功能中检测到的环境参数、车辆状态、操作等信息在 中控屏上进行显示

    三,代码实现

    (1)倒车雷达

    hcsr.c(使用定时器4进行距离计算)

    1. void hcsr04_NVIC()
    2. {
    3. NVIC_InitTypeDef NVIC_InitStructure;
    4. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    5. NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    7. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    8. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    9. NVIC_Init(&NVIC_InitStructure);
    10. }
    11. //IO口初始化 及其他初始化
    12. void Hcsr04Init()
    13. {
    14. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    15. GPIO_InitTypeDef GPIO_InitStructure;
    16. RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
    17. GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;
    18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    20. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    21. GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    22. GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
    23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    24. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    25. GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
    26. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    27. TIM_DeInit(TIM4);
    28. TIM_TimeBaseStructure.TIM_Period = (1000-1);
    29. TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
    30. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    31. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    32. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    33. TIM_ClearFlag(TIM4, TIM_FLAG_Update);
    34. TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
    35. hcsr04_NVIC();
    36. TIM_Cmd(TIM4,DISABLE);
    37. }
    38. //打开定时器4
    39. static void OpenTimerForHc()
    40. {
    41. TIM_SetCounter(TIM4,0);
    42. msHcCount = 0;
    43. TIM_Cmd(TIM4, ENABLE);
    44. }
    45. //关闭定时器4
    46. static void CloseTimerForHc()
    47. {
    48. TIM_Cmd(TIM4, DISABLE);
    49. }
    50. //定时器4终中断
    51. void TIM4_IRQHandler(void)
    52. {
    53. if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
    54. {
    55. TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
    56. msHcCount++;
    57. }
    58. }
    59. //获取定时器4计数器值
    60. u32 GetEchoTimer(void)
    61. {
    62. u32 t = 0;
    63. t = msHcCount*1000;
    64. t += TIM_GetCounter(TIM4);
    65. TIM4->CNT = 0;
    66. delay_ms(50);
    67. return t;
    68. }
    69. //通过定时器4计数器值推算距离
    70. float Hcsr04GetLength(void )
    71. {
    72. u32 t = 0;
    73. int i = 0;
    74. float lengthTemp = 0;
    75. float sum = 0;
    76. while(i!=5)
    77. {
    78. TRIG_Send = 1;
    79. delay_us(20);
    80. TRIG_Send = 0;
    81. while(ECHO_Reci == 0);
    82. OpenTimerForHc();
    83. i = i + 1;
    84. while(ECHO_Reci == 1);
    85. CloseTimerForHc();
    86. t = GetEchoTimer();
    87. lengthTemp = ((float)t/58.0);//cm
    88. sum = lengthTemp + sum ;
    89. }
    90. lengthTemp = sum/5.0;
    91. return lengthTemp;
    92. }

    hcsr.h

    1. #ifndef __HCSR_H
    2. #define __HCSR_H
    3. #define HCSR04_PORT GPIOB
    4. #define HCSR04_CLK RCC_APB2Periph_GPIOB
    5. #define HCSR04_TRIG GPIO_Pin_11
    6. #define HCSR04_ECHO GPIO_Pin_10
    7. #define ECHO_Reci PBin(10)
    8. #define TRIG_Send PBout(11)
    9. void hcsr04_NVIC(void);
    10. void Hcsr04Init(void);
    11. static void OpenTimerForHc(void);
    12. static void CloseTimerForHc(void);
    13. void TIM4_IRQHandler(void);
    14. void NVIC_Configuration(void);
    15. float Hcsr04GetLength(void );
    16. #endif

    (2)AD(对 雨滴与光敏电阻传感器进行AD采集)

    1. #include "stm32f10x.h" // Device header
    2. #include "stm32f10x_adc.h"
    3. void AD_Init(void)
    4. {
    5. ADC_InitTypeDef ADC_InitStructure;
    6. GPIO_InitTypeDef GPIO_InitStructure;
    7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    9. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    13. GPIO_Init(GPIOA, &GPIO_InitStructure);
    14. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    15. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    16. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    17. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    18. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    19. ADC_InitStructure.ADC_NbrOfChannel = 1;
    20. ADC_Init(ADC1, &ADC_InitStructure);
    21. ADC_Cmd(ADC1, ENABLE);
    22. ADC_ResetCalibration(ADC1);
    23. while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    24. ADC_StartCalibration(ADC1);
    25. while (ADC_GetCalibrationStatus(ADC1) == SET);
    26. }
    27. uint16_t AD_GetValue(uint8_t ADC_Channel)
    28. {
    29. ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
    30. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    31. while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    32. return ADC_GetConversionValue(ADC1);
    33. }

    main.c(倒车雷达)

    1. //倒车雷达
    2. if(KEY1 ==0) //按键1进行加
    3. {
    4. delay_ms(100);
    5. if(KEY1==0)
    6. biaozhun+=changdu;
    7. }
    8. if(KEY2==0) //按键2进行减
    9. {
    10. delay_ms(100);
    11. if(KEY2==0)
    12. biaozhun-=changdu;
    13. }
    14. printf("距离为:%.3fcm\n",Hcsr04GetLength());
    15. printf("阈值为:%d\n",biaozhun);
    16. //阈值
    17. showhanzi(10,40,4);
    18. showhanzi(40,40,5);
    19. LCD_ShowNum(90,40,biaozhun,4);
    20. LCD_ShowString(120,40,"cm");
    21. //距离
    22. showhanzi(10,80,6);
    23. showhanzi(40,80,7);
    24. LCD_ShowNum(90,80,Hcsr04GetLength(),4);
    25. LCD_ShowString(120,80,"cm");
    26. //达到阈值时进行蜂鸣器警报
    27. if(Hcsr04GetLength()
    28. {
    29. GPIO_ResetBits(GPIOB, GPIO_Pin_12);
    30. }
    31. else
    32. {
    33. GPIO_SetBits(GPIOB, GPIO_Pin_12);
    34. }

    (3)雨刷

    1. if((AD1<4100) &&(AD1>3600))
    2. {
    3. TIM_SetCompare1(TIM2, 500);
    4. TIM_SetCompare2(TIM2, 500);
    5. delay_ms(1000);
    6. TIM_SetCompare2(TIM2, 500);
    7. TIM_SetCompare1(TIM2, 500);
    8. printf("1");
    9. }
    10. else if((AD1<3599) &&(AD1>1500))
    11. {
    12. TIM_SetCompare1(TIM2, 500);
    13. TIM_SetCompare2(TIM2, 500);
    14. delay_ms(1000);
    15. TIM_SetCompare2(TIM2, 1000);
    16. TIM_SetCompare1(TIM2, 1000);
    17. printf("2");
    18. }
    19. else
    20. {
    21. TIM_SetCompare1(TIM2, 500);
    22. TIM_SetCompare2(TIM2, 500);
    23. delay_ms(500);
    24. TIM_SetCompare2(TIM2, 1000);
    25. TIM_SetCompare1(TIM2, 1000);
    26. printf("3");
    27. }

    (4)灯光

    1. //车灯逻辑判断
    2. if((AD0<4000) &&(AD0>3001))
    3. {
    4. GPIO_ResetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14);
    5. printf("4");
    6. }
    7. else if((AD0<3000) &&(AD0>1500))
    8. {
    9. GPIO_SetBits(GPIOC, GPIO_Pin_13);
    10. GPIO_ResetBits(GPIOC, GPIO_Pin_14);
    11. printf("5");
    12. }
    13. else
    14. {
    15. GPIO_SetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14);
    16. printf("6");
    17. }
    18. }

    最后总结:

    在进行舵机转动的时候注意一定将舵机接入5V,血的教训,在舵机电压不够的时候将会出现程序死机的 现象,当时以为 中断 的问题,用串口进行调试 ,最后因为 舵机电压不够导致的。需要程序的可以私信哦

    小编码字不容易 留一个赞吧

  • 相关阅读:
    圈重点|等保2.0灾备方案怎么做?
    11 | Spark计算数据文件中每行数值的平均值
    Ruby编程语言学习
    Android 9 画中画实现流程
    代码随想录-Day36
    axios get请求不能通过body 数据json数据
    【面试经典150 | 数组】跳跃游戏
    api接口为什么需要加密,PHP接口加密的方法有哪些
    竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉
    springboot admin自定义监控里的info信息
  • 原文地址:https://blog.csdn.net/m0_69550154/article/details/133939084