你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
zww 提问时间:2014-12-12 21:56 /
本帖最后由 king-388328 于 2014-12-12 21:56 编辑

为了更好的测试控制器的各个轴,特意找了一个以前的旧航模遥控器

IMG_20141211_232505.jpg

打开后盖根据四个轴电位器的连线找到板子上对应的焊点,找来一根网线焊上四个轴的引出点和电位器的GND以及供电端,我是用的开发板上的3.3V给它供电,具体接法如下:
IMG_20141211_230745.jpg

放大看看

IMG_20141211_230803.jpg


接好后盖上盖子,接下来找来洞洞板把做一个AD输入的滤波电路滤除毛刺以及抗干扰,如下:

IMG_20141212_204054.jpg

四个轴的模拟量串联一个1K电阻,近点看看:

IMG_20141212_204104.jpg

再在后端,也就是MCU的ADC输入引脚并联一个0.1uF的电容组成RC低通滤波电路消除输入的毛刺,如下

IMG_20141212_204040.jpg

只用了上面四个AD通道,对应开发板的A0-A3模拟量输入通道,A0对应左X轴,A1对应左Y轴,A2对应右X轴,A3对应右Y轴,放大看看

IMG_20141212_204123.jpg

现在插到板子上:

IMG_20141212_203943.jpg

六个按钮对应控制器的按钮1到6。

IMG_20141212_203954.jpg

现在修改代码,在主线程里采集各轴电压并上报给电脑

QQ截图20141212214006.jpg
其中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
};


编译运行,看看效果:
IMG_20141212_203932.jpg

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

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


代码见附件:
Nucleo_F072RB_Car.rar (3.97 MB, 下载次数: 49)
收藏 评论7 发布时间:2014-12-12 21:56

举报

7个回答
沐紫 回答时间:2014-12-15 17:27:53
点个赞!!
wamcncn 回答时间:2014-12-25 20:40:57
高手啊,读书不如看示例
星辰一方 回答时间:2015-2-1 13:05:46
不错,好详细,感谢分享!
xiaodc88 回答时间:2015-2-1 18:54:21
这东西好啊
麟狮蕟 回答时间:2015-2-2 08:54:24
收藏了。。。。。
sdkdwyb-321669 回答时间:2015-2-6 15:22:27
高啊,好好学习一下
jinshan2014 回答时间:2017-11-2 21:08:22
感谢分享!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版