king-388328 发表于 2014-12-12 21:56:25

[STM32F072 Nucleo]开发笔记(五) 接上航模控制器的四个模拟轴

本帖最后由 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__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
};

编译运行,看看效果:


模拟轴操作果然不一样,可以精确的控制方向的角度,油门的大小和刹车的强度。

接下来就要加入数字滤波算法,消除各个轴的抖动。


代码见附件:


沐紫 发表于 2014-12-15 17:27:53

点个赞!!

wambob 发表于 2014-12-25 20:40:57

高手啊,读书不如看示例

星辰一方 发表于 2015-2-1 13:05:46

不错,好详细,感谢分享!

xiaodc88 发表于 2015-2-1 18:54:21

这东西好啊

linshifaa 发表于 2015-2-2 08:54:24

收藏了。。。。。

sdkdwyb-321669 发表于 2015-2-6 15:22:27

高啊,好好学习一下

jinshan2014 发表于 2017-11-2 21:08:22

感谢分享!
页: [1]
查看完整版本: [STM32F072 Nucleo]开发笔记(五) 接上航模控制器的四个模拟轴