在线时间32 小时
UID388328
ST金币0
蝴蝶豆0
注册时间2008-1-7
中级会员
- 最后登录
- 2019-11-14
|
a0a.1 32b0c
本帖最后由 king-388328 于 2014-12-12 21:56 编辑
为了更好的测试控制器的各个轴,特意找了一个以前的旧航模遥控器
打开后盖根据四个轴电位器的连线找到板子上对应的焊点,找来一根网线焊上四个轴的引出点和电位器的GND以及供电端,我是用的开发板上的3.3V给它供电,具体接法如下:
放大看看
接好后盖上盖子,接下来找来洞洞板把做一个AD输入的滤波电路滤除毛刺以及抗干扰,如下:
四个轴的模拟量串联一个1K电阻,近点看看:
再在后端,也就是MCU的ADC输入引脚并联一个0.1uF的电容组成RC低通滤波电路消除输入的毛刺,如下
只用了上面四个AD通道,对应开发板的A0-A3模拟量输入通道,A0对应左X轴,A1对应左Y轴,A2对应右X轴,A3对应右Y轴,放大看看
现在插到板子上:
六个按钮对应控制器的按钮1到6。
现在修改代码,在主线程里采集各轴电压并上报给电脑
其中GetADCValue函数用于启动ADC转换,为了提高稳定性我采取多次采样求平均值
static int GetADCValue(uint32_t Channel,uint32_t Count)
{
int i,val = 0;
hadc.Instance->CHSELR = 0x1 << Channel;
for(i = 0; i < Count; i++)
{
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc,1);
val += HAL_ADC_GetValue(&hadc);
}
return val / Count;
}
由于072的ADC为12位分辨率(0 ~ 4095),因此对HID报告描述符也要进行相应修改
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x02, // USAGE_PAGE (Simulation Controls)
0x09, 0xc8, // USAGE (Steering)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM (4095)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0xc4, // USAGE (Accelerator)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM (4095)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0xc5, // USAGE (Brake)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x0f, // LOGICAL_MAXIMUM (4095)
0x75, 0x10, // REPORT_SIZE (16)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x10, // REPORT_COUNT (16)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
编译运行,看看效果:
模拟轴操作果然不一样,可以精确的控制方向的角度,油门的大小和刹车的强度。
接下来就要加入数字滤波算法,消除各个轴的抖动。
代码见附件:
Nucleo_F072RB_Car.rar
(3.97 MB, 下载次数: 47)
|
|