文章目录
-
- 基础知识入门
-
- 关于核心板
- 什么是主板和驱动板?
- 关于电机:
- 关于舵机
- 关于编码器
- 关于oled显示屏
- 关于串口
- 一些学长留给我们的建议
-
-
- PCB制板注意事项:
- 提高调试效率方法:
-
基础知识入门
楼主采用越野L车模(高大威猛的一批),整体控制电机转速(直道加速,弯道减速,防止冲出轨道),控制舵机的角落,类似骑自行车。
关于核心板
我用的是山外K60 UD核心板,建议大家用山外板,真的很好用。我们队一开始用的是学长留下的蓝宙芯片。我很难过。。。用山外芯片和dap之后,我再也没有纠结过烧写的问题。其他与汽车相关的问题也可以问山外客服。山外很棒! 
什么是主板和驱动板?
驱动板是一个相对独立的部分,其唯一的功能是把它放在一边PWM由于核心板的原因,放大并添加到电机两侧PWM相应的电压小,不足以驱动电机旋转。什么是?PWM,将介绍以下电机部分。
主板是汽车的核心, 主板的部分电路是,比如5V稳压,3.3V,舵机所需的6V或更高的电压 等等
,例如,我需要使用核心板的引脚,因为核心板插入主板,不能直接连接,所以我需要在画板时留下接口。例如,我需要使用它A8这只脚,我需要在主板上pcb文件中,把A8引脚对应位置的通孔(通孔1)出来,另一个通孔(通孔2)放在主板的其他地方,如果需要的话A8这只脚,我直接把线连接到刚才留下的通孔2上,这样就间接连接到核心板上A8这个脚了。
关于电机:
因为一开始很小白,一直在纠结PWM是什么?看了相关论文和视频介绍,越看越慌。其实不用纠结,不用纠结,几行代码就能搞定! 比如给电机12V如果电压满了PWM(占空比)相当于在电机两侧加12V电压,电机转速最大; 如果占空比为50%,电压会更小,大约6-8V左右转速会相应降低(电压与占空比正相关,即占空比越大,电压越大,转速越快,我不知道两者是否线性相关)。
void FTM_PWM_init(FTMn_e ftmn, FTM_CHn_e ch, uint32 freq, uint32 duty)//引脚初始化代码 函数中各参数的定义如下:
,有FTM0、 FTM1、 FTM2 这三个模块可供选择。 (CH0~CH7), (单位为Hz) ,占空比 = duty / FTMn_PRECISON,这个FTMn_PRECISON是可以在ftm.h文件中自行调整调整的,比如我的代码是这样的:
#define FTM0_PRECISON 100u #define FTM1_PRECISON 20000u #define FTM2_PRECISON 1000u 你不需要关心模块号和通道号是什么。你只需要知道模块中的每个通道号对应一个引脚,比如FTM0_CH6对应核心板上的引脚。如果您向核心板供电,请调用代码输出引脚PWM波,它会顺从一个波形,有两个这样的波形PWM电机引脚两侧分别加波,电机将相应输入两个PWM不同比例的差值达到不同的速度。
FTM_PWM_init(FTM0, FTM_CH2, 10000, 0); FTM_PWM_init(FTM0, FTM_CH3, 10000, 0);//初始化 电机 pwm
即给核心板上的两个引脚分别初始化,频率为10k(电机一般都是这个频率),占空比初始设置为0,。
示波器上面观察一下。
FTM_PWM_Duty(FTM0, FTM_CH2,0);
FTM_PWM_Duty(FTM0, FTM_CH3,50);//这里的50 是因为 FTM0 的 FTM0_PRECISON 是100 , 那么传入50 的话 占空比即为 50 %
当你把这两个通道对应的引脚通过驱动板升压再接到电机两侧,你就可以看到电机转动起来了。
关于舵机
与电机类似,舵机也是通过调整输出的PWM占空比来进行调整打角的大小。与上文一样, 与电机略有不同的是,
这里便要放出一个经典的图了,如下:
| PWM占空比大小 | 舵机打角角度 |
|---|---|
| 2.5 % | -90度 |
| 5 % | -45度 |
| 7.5 % | 0度 |
| 10 % | 45度 |
| 12.5 % | 90度 |
具体代码如下:
FTM_PWM_init(FTM1, FTM_CH0, 100, 1500);//初始化舵机
之后再控制舵机打角时, 因为我们乖乖限幅了,所以舵机从头到尾只坏了一个,还是因为莫名其妙的原因坏掉的,其他队没太注重限幅的都换了7、 8个, 那可都是钱啊! 钱啊!!!
关于编码器
编码器我们最开始纠结了好久,不知道怎么用,搜了好多资料越看越迷,都是在扯A相、B相、正交解码、上升下降沿啥的,看完之后毫无收获,其实说白了就三行代码
| 枚举 | 管脚号 |
|---|---|
| LPT0_ALT1 | PTA19 |
| LPT0_ALT2 | PTC5 |
lptmr_pulse_init(LPT0_ALT1,0xFFFF,LPT_Rising);//初始化编码器 lptmr
uint32 num = lptmr_pulse_get(); // lptmr_pulse_get 函数会返回一个值,记录了从上次清零到本次调用该函数时编码器
记录的值的大小,这个值是和电机转动的圈数正线性相关的
lptmr_pulse_clean(); 清零函数,把编码器记录的值清零
那么如果我想知道车子转一圈编码器的值是多少,我就只需要先调用clean函数清零,然后转动轮子一圈,这时调用lptmr_pulse_get函数返回的值便是轮子转这一圈对应的编码器记录的值的大小了。
关于oled显示屏
oled显示屏是超级推荐大家使用的,主要用来实时显示各路电感的值的大小,还有一些Flag是否被触发啊什么的,方便你找规律,还是那句话:不要纠结,山外的代码例程都有例子,你只用接好线,调用函数,就能输出你想要的东西啦。
关于串口
在处理大批数据时,串口就发挥着极大的作用,这里还是推荐下山外的nrf无线串口,使用方法跟传统串口一毛一样,关键是无线啊!无线啊!!! 远程传输、无线调车,你值得拥有!!!!!(看在我经常有问题去麻烦山外客服的份上,就不收广告费了)
附录一些学长留给我们的建议
PCB制板注意事项:
提高调试效率方法:
- 蜂鸣器等来提示是否成功检测到某个状态
本文主要是基础知识总结,关于调车中出现的各种情况的处理方法,大家可以看看我队友写的 常见问题解决方法汇总——十四届恩智浦智能车室外电磁越野组