楼主是19安徽赛区室外电磁小白一枚,由于学校历届组别使用的都是摄像头,电磁用的很少,所以今年几乎从零开始。在这半年的智能车调试中也走了不少弯路,有了一些收获,现将参赛总结记录如下:  

文章目录

 
    • 入门基础知识
      • 关于核心板
      • 关于什么是主板和驱动板
      • 关于电机:
      • 关于舵机
      • 关于编码器
      • 关于oled显示屏
      • 关于串口
      • 附录一些学长留给我们的建议
          • PCB制板注意事项:
          • 提高调试效率方法:
 

入门基础知识

  楼主用的是越野型L车模(高大威猛的一批),整体就是控制电机的转速(直道加速,弯道减速以防冲出赛道)、控制舵机的打角,类似于骑自行车。  

关于核心板

  我是用的山外的K60 UD核心板,建议大家用山外的板子,真滴好用。我们队最开始用的是学长留下来的一块蓝宙的芯片,心酸不必言说。换用山外芯片和dap之后,再没纠结过烧写的问题,车相关的其他问题还可以问山外客服,山外牛逼!   它大概长这个样子:   微信图片_20201205164857  

关于什么是主板和驱动板

  驱动板: 驱动板是比较独立的一个部分,它的唯一作用就是把PWM放大,然后加到电机两侧,因为核心板产生的PWM对应的电压较小,不足以驱动电机转动。至于什么是PWM,在下文的电机部分会有所介绍。   然后,由于驱动板难焊是一个普遍存在的问题,所以在调车初期不要纠结焊驱动板的问题(我们队就是最开始焊接技术不好,焊了一个月的驱动板都没焊好,浪费了好多时间),大家可以直接拿往届学长的驱动板先用着,把车最快速度跑起来才是王道!!!   主板: 主板就是车的核心, 主板的部分电路是提供不同大小电压的,比如5V稳压,3.3V,舵机所需的6V或者更高的电压 等等   另一部分的作用主要是留出接口,比如我需要用核心板的某个引脚,因为核心板被插到主板上了,没办法直接接,所以我需要在画板子的时候就把这个接口留出来。比如我需要用A8这个脚,我就需要在主板的pcb文件中,把A8这个引脚对应位置的通孔(通孔1)接线出来,另成一个通孔(通孔2)放到主板其他地方,如果我需要用A8这个脚,我就直接把线接到刚才留出的通孔2上面就行了,这样就间接的连到核心板的A8这个脚了。  

关于电机:

  由于最初很小白,一直在纠结PWM是个什么东西,看了相关论文和视频介绍,越看越慌。其实不用纠结,不用纠结,几行代码就搞定的事!!!   电机PWM(占空比)作用可以理解为我们可以通过调整占空比的大小来调整电机两侧的电压。   比如给电机12V电压,如果满PWM(占空比)的话,相当于在电机两侧加了12V电压,电机转速达到最大; 如果占空比为50%的话,电压会小一些,大概在6-8V左右,转速也会相应减小(电压与占空比是正相关,即占空比越大,电压越大,转速越快,两者是否线性相关我不太清楚)。   初期不用纠结对应不同情况调PWM,只需初始给电机一个PWM,恒速跑完一圈再纠结。   初始化代码如下:  

void FTM_PWM_init(FTMn_e ftmn, FTM_CHn_e ch, uint32 freq, uint32 duty)//引脚初始化代码

  函数中各参数的定义如下: FTMn_e 是模块号,有FTM0、 FTM1、 FTM2 这三种模块可供选择。   FTM_CHn_e 是通道号(CH0~CH7), freq 是频率(单位为Hz) duty是占空比分子,占空比 = duty / FTMn_PRECISON,这个FTMn_PRECISON是可以在ftm.h那个文件里面自己进行调整的,比如我的代码里面是这样的:  
#define FTM0_PRECISON 100u    
#define FTM1_PRECISON 20000u     
#define FTM2_PRECISON 1000u     
  那如果我是用的是FTM0, 想要一个占空比为50%的PWM波,那我就需要给函数的duty赋值为50就行了,占空比即为50/100 = 50 %, 如果我是用的是FTM1, 我如果向给一个占空比为30%的PWM波,那我就需要给函数的duty赋值为6000就行了,占空比即为6000/20000 = 30 %。   一开始看到这行init代码可能会被吓到,没事,你不用管这个代码具体怎么实现的,你只需要在你写的东西里面调用就行了。   关于那个模块号和通道号,你不需要管它到底是啥,你只需要知道一个模块中的每一个通道号对应一个引脚,比如FTM0_CH6就对应着核心板上的一个引脚,如果你给核心板供电,再调用代码让这个引脚输出一个PWM波,它就会乖乖输出一个波形,有两个这样的PWM波分别加到电机引脚两侧,电机就会对应输入两个PWM占空比的差值不同而达到不同的转速。   我们队的代码里面电机的初始化如下:  
	FTM_PWM_init(FTM0, FTM_CH2, 10000, 0);  
    FTM_PWM_init(FTM0, FTM_CH3, 10000, 0);//初始化 电机 pwm
  即给核心板上的两个引脚分别初始化,频率为10k(电机一般都是这个频率),占空比初始设置为0,。   关于引脚与通道号的对应关系,在K60官方手册里面有列出,大家可以去对照着看。   微信图片_20201205164948   举个例子,对于上图的PTA7, 它是指核心板上的 A7这个管脚,它对应的是FTM0_CH4 这个通道号,如果你在代码里面让FTM0_CH4 输出一个占空比为50% 的pwm 波,那么A7 这个管脚上就会输出一个波形,占空比为 50% ,你可以把它连到示波器上面观察一下。   现在我如果想让电机接收到占空比为50%的波而转动,我可以这样  
	FTM_PWM_Duty(FTM0, FTM_CH2,0);
    FTM_PWM_Duty(FTM0, FTM_CH3,50);//这里的50 是因为 FTM0 的 FTM0_PRECISON  是100 , 那么传入50 的话 占空比即为 50 %
  这个 FTM_PWM_Duty 函数的作用是改变某个通道的占空比,因为不能说初始化的时候设置完占空比就不能改变了,那样就不存在车子的加减速了,你想要多大的占空比,就调用这个函数传入不同占空比就行了。   当你把这两个通道对应的引脚通过驱动板升压再接到电机两侧,你就可以看到电机转动起来了。  

关于舵机

  与电机类似,舵机也是通过调整输出的PWM占空比来进行调整打角的大小。与上文一样,不需要纠结舵机到底是什么东西,你只需要给舵机供电,然后给舵机的信号线输出一个PWM波,舵机就会打到对应占空比的角度,车子便可以做到不同角度的转弯。   与电机略有不同的是,电机是转速与占空比呈正相关关系,占空比越大,转速越快;而舵机只有在一定的占空比范围之内才能工作,如果超出这个范围的话舵机有可能会烧坏(一个舵机100来块钱,大家注意使用的时候一定要限幅哈)。   这里便要放出一个经典的图了,如下:   微信图片_20201205165026     是不是感觉一脸懵逼,哈哈,其实不用纠结这么多,上面这张图片的意思就是舵机的打角与PWM占空比之间是一个线性映射的关系,上图可用下面的表格来表示   1607158254(1)   在我们队的代码里面,关于舵机也只是调用了那两个函数 FTM_PWM_init() 和 FTM_PWM_Duty()   具体代码如下:  

    FTM_PWM_init(FTM1, FTM_CH0, 100, 1500);//初始化舵机

  这行代码初始化FTM1_CH0 为频率100HZ,初始占空比 1500 / 20000 = 7.5% 。 ps:注意1500是我们传入的参数,真正的占空比是 1500 / FTM1_PRECISON (由于我们代码里面FTM1_PRECISON 是 20000, 所以即初始化向舵机信号口输出 7.5% 占空比的波,即初始让舵机打到中值位置)   之后再控制舵机打角时,由于L车前轮如果不改装的话大概最大能打到45度左右,所以我们将FTM_PWM_Duty 参数限制在了1000 - 2000 (即占空比5% - 10% 、 打角 -45度 到 45度之间), 因为我们乖乖限幅了,所以舵机从头到尾只坏了一个,还是因为莫名其妙的原因坏掉的,其他队没太注重限幅的都换了7、 8个, 那可都是钱啊! 钱啊!!!  

关于编码器

  编码器我们最开始纠结了好久,不知道怎么用,搜了好多资料越看越迷,都是在扯A相、B相、正交解码、上升下降沿啥的,看完之后毫无收获,其实说白了就三行代码 (我们是单电机,用的是lptmr计数,只使用了A相、5V 、 GND 这三根线就够了,A相连了核心板的A19 口):   在整个核心板上,一共有两个口可以lptmr计数,分别是 A19 和 C5   1607158290(1)   初始化:  
 lptmr_pulse_init(LPT0_ALT1,0xFFFF,LPT_Rising);//初始化编码器 lptmr
  调用lptmr计数:  
uint32 num = lptmr_pulse_get(); // lptmr_pulse_get 函数会返回一个值,记录了从上次清零到本次调用该函数时编码器
记录的值的大小,这个值是和电机转动的圈数正线性相关的

lptmr_pulse_clean(); 清零函数,把编码器记录的值清零
  那么如果我想知道车子转一圈编码器的值是多少,我就只需要先调用clean函数清零,然后转动轮子一圈,这时调用lptmr_pulse_get函数返回的值便是轮子转这一圈对应的编码器记录的值的大小了。   注意: 编码器有一个较为特殊的点,直接将编码器的A相输出口接到 A19上的话,你会发现编码器get的值绝大部分时候都是0,只有在上电瞬间才会有值,哈哈,因为编码器的A相在接到A19口的同时需要上拉一个4.7K 的电阻到 3.3V电压上面去,这样get到的值才是正常的。  

关于oled显示屏

  oled显示屏是超级推荐大家使用的,主要用来实时显示各路电感的值的大小,还有一些Flag是否被触发啊什么的,方便你找规律,还是那句话:不要纠结,山外的代码例程都有例子,你只用接好线,调用函数,就能输出你想要的东西啦。  

关于串口

  在处理大批数据时,串口就发挥着极大的作用,这里还是推荐下山外的nrf无线串口,使用方法跟传统串口一毛一样,关键是无线啊!无线啊!!! 远程传输、无线调车,你值得拥有!!!!!(看在我经常有问题去麻烦山外客服的份上,就不收广告费了)  

附录一些学长留给我们的建议

 
PCB制板注意事项:
  • 尽量加宽电源、地线宽度,最好是地线比电源线宽,它们的关系是:地线>电源线>信号线,通常信号线宽为:0.2~0.3mm,最经细宽度可达0.05~0.07mm,电源线为1.2~2.5 mm
  • 位于电路板边缘的元件,离电路板边缘一般小于2mm
  • 当与焊盘的连接走线较细时,要将焊盘与走线之间的连接设计成泪滴状
  • 接地线应尽量加粗。若接地线用很细的线条,则接地电位随电流的变化而变化,使抗噪能力降低。因此应将接地线加粗,使它能通过三倍于PCB上的允许电流。如有可能,接地线宽度应在2~3mm以上
  • 大面积覆铜 所谓覆铜,就是将PCB上没有布线的地方,铺满铜膜。PCB上的大面积覆铜有两种作用:一为散热;另外还可以减小地线阻抗,并且屏蔽电路板的信号交叉干扰以提高电路系统的抗干扰能力
  • 注意导线的宽度是否满足要求,尤其是电源线和地线,能加宽的地方一定要加宽,以减小阻抗。
  • 焊盘的内孔一般不小于0.6mm,因为小于0.6mm的孔开模冲孔时不易加工
  • 通常情况下以金属引脚直径值加上0.2mm作为焊盘内孔直径
  • 建议画PCB时在电路板四周各打一个直径为3.3-3.5mm的孔用以上螺丝固定
 
提高调试效率方法:
  • 调试时尽量使用蓝牙串口查看波形
  • 同时可配合使用OLED显示屏看数据
  • 适量加入一些模块比如蜂鸣器等来提示是否成功检测到某个状态
  • 建议采用离线调试的方法,如增加独立按键模块、手机蓝牙发送数据,红外遥控发送数据等,不需要每次修改参数都连接下载器重新烧录程序。
  本文主要是基础知识总结,关于调车中出现的各种情况的处理方法,大家可以看看我队友写的 常见问题解决方法汇总——十四届恩智浦智能车室外电磁越野组