Hanker

uCOS 学习随笔 StepbyStep-3—— 任务设计(基于STM32控制的第四代圆梦小车)

0
阅读(8238)

[提要] 本篇为“uCOS 学习随笔”第三篇。重点介绍如何基于小车的控制需求构建任务,并实现了第一个 uCOS 下的任务:与上位机通讯。初步体验了基于操作系统编程的差异,感觉不错!

一、概述

   这一步要基于小车的 STM32 控制硬件及控制需求,完成概要设计,构建任务框架。

   因此首先要了解 STM32 控制板的硬件和需求。

二、控制板硬件说明

1) 左侧电机驱动、检测I/O:

   Ctrl-L1 —— PA2,Output push-pull,电机 PWM 控制,可用 T2CH3 的输出产生 PWM。(PWM 频率建议使用 125Hz)

   Ctrl-L2 —— PA1,Output push-pull,电机工作状态控制,详见底盘介绍中的控制逻辑。

   Ctrl-L3 —— PA0,Output push-pull, 电机工作状态控制,详见底盘介绍中的控制逻辑。

   MotorL-Puls —— PB9,Input-pull-down,码盘信号,用 EXTI 9 或 T4CH4 中断。

   MotorL-I —— PC0,Analog Input,左侧电机电流,用 ADC_IN10 采集。

   L-Vbat —— PC1,Analog Input,左侧电机供电电压,用 ADC _IN11 采集。

2)右侧电机驱动、检测I/O:

   Ctrl-R1 —— PA8,Output push-pull,电机PWM控制,可用 T1CH1 输出产生 PWM。

   Ctrl-R2 —— PC9,Output push-pull,电机工作状态控制,详见底盘介绍中的控制逻辑。

   Ctrl-R3 —— PC8,Output push-pull, 电机工作状态控制,详见底盘介绍中的控制逻辑。

   MotorR-Puls —— PC7,Input-pull-down,码盘信号,用 EXTI 7或 T3CH2(Remap) 中断。

   MotorR-I —— PC5,Analog Input,左侧电机电流,用 ADC_IN15 采集。

   R-Vbat —— PC4,Analog Input,左侧电机供电电压,用 ADC_IN14 采集。

3)上位机无线终端接口:(接 Micro2440 的 COM0)

   STM32-TXD1 —— PA9,打开串口时 Alternate function push-pull,关闭时 Input pull-up,为Micro2440有线终端方式提供可能;使用 USART 1。

   STM32-RXD1 —— PA10,Input pull-up,使用 USART 1。

4)与上位机无线通讯:(接 Micro2440 的 COM1)

   STM32-TXD3 —— PC10,打开串口时 Alternate function push-pull,关闭时 Input pull-up,为 Micro2440 用 COM2 接外设提供可能;使用 USART 3,需要 Remap。

   STM32-RXD3 —— PC11,Input pull-up,使用 USART 3,需要 Remap

5)无线终端上行通道:(从小车发送到PC)

   SPI-MOSI —— PB15,Alternate function push-pull,SPI 口主数据输出,使用 SPI 2。

   SPI-MISO —— PB14,Input-pull-down,SPI 口主数据输入,使用 SPI 2。

   SPI-SCK —— PB13,Alternate function push-pull,SPI 口主时钟,使用 SPI 2。

   24L01T-CS —— PA6,Output push-pull,上行无线模块片选信号输出。

   24L01T-CE —— PA7,Output push-pull,上行无线模块发送使能信号输出。

   24L01T-IRQ —— PB5,Input pull-up,上行无线模块中断信号输入,用 EXTI  5 中断。

6)无线终端下行通道:(从PC发送到小车,SPI口和上行共用 SPI 2)

   24L01R-CS —— PA5,Output push-pull,下行无线模块片选信号输出。

   24L01R-CE —— PA4,Output push-pull,下行无线模块发送使能信号输出。

   24L01R-IRQ —— PB0,Input pull-up,下行无线模块中断信号输入,用 EXTI 0 中断。

7)充电电源检测:

   DC-CHECK —— PC2,Analog Input,充电电源电压检测,使用 ADC_IN12。

8)传感器扩展:(使用I2C接口,配一根 I/O线)

   SCL —— PB6,Alternate function open-drain,I2C 时钟输出,使用 I2C 1。

   SDA —— PB7,Alternate function open-drain,I2C 数据线,使用 I2C 1。

   GYRO-IN —— PC3,暂时设置为 Analog Input,使用 ADC_IN13,可根据需要修改。

控制板如下:

基于STM32控制的第四代圆梦小车
 

基于STM32控制的第四代圆梦小车
 
三、小车控制需求

1) 电机驱动 —— 控制电机正、反转、调速、刹车、惰行

2) 码盘采样 —— 采集车轮转动信息,控制行走距离和速度

3) 电机电流检测 —— 测量电机工作电流,判断电机运动状态及转速

4) 电池电压测量 —— 辅助电流测量,计算转速,得到快速的速度反馈。同时兼做为电池剩余电量监测,根据电压判断是否要充电,根据电机工作和不工作之间的电压差计算电池内阻变化,从而判断电池是否需要更换。

5) 充电电源检测 —— 检测充电电压,判断目前是否处在充电状态

6) 传感器扩展 —— 能扩充一些后续学习中所必须增加的传感器

7) 和上位机通讯 —— 接受上位机控制,上传小车及传感器信息

8) 无线终端链路 —— 这是一个为上位机服务的功能,因为在 Linux 下编程,需要用串口和 PC相连,使用“超级终端”作为人机界面。而小车是移动的,用线缆很不方便,故设计一个全双工的无线链路,实现 PC 终端的无线操作。此无线链路由下位机控制无线模块实现。

9) 实时时钟 —— 这是一个辅助功能,为做一个自主生存的机器人所预备。

   以上为小车的初步控制需求,随着学习的深入,需求会不断细化、拓宽。

……

四、控制逻辑构思及任务设计

   第一阶段设计重点在于一些基础功能的实现,有些像 BSP,让小车的硬件能购工作,如电机能转、通讯能收发、电机运转状态能采集等。而这些基础任务之上的高级处理,留待第二阶段考虑,如:如何基于码盘采集的信号控制转速?如何基于收到的命令完成相应的任务等。  

初步构思的基础任务有:
1) 电机驱动 —— 完成电机转动方向和 PWM 值的控制。

2) 电机电流、电压采集 —— 完成电机 PWM 有效和无效时的电流电压采集。

3) 码盘信号采集 —— 完成码盘信号采集,并计算出一些基本参数,如倍频后的速率。

4) 与上位机通讯 —— 基于 UART3 实现数据接收和应答。

充电电源检测、传感器扩展、无线终端链路、实时时钟暂缓,等上述基础任务完成后再作考虑。

下面分别就上述任务进行详细设计。

…… (详细内容请下载 PDF 文件)

4.1 电机驱动任务

……

4.2 电机电流、电压采集任务

……

4.3 码盘信号采集任务

……

4.4 与上位机通讯任务

……

4.5 任务优先级确定

……

五、与上位机通讯任务的实现

   因为通讯是小车目前唯一的人机交互通道,为了便于其它功能的测试,首先得解决人机交互问题,和二代小车一样,第一步先实现内存的读写,此处倒并非是为了调试,因为 STM32 支持  JTAG,调试很方便。此处选择这个是因为比较简单,同时也容易和二代小车的 StepbyStep 对照学习。

5.1 程序构建

第一步:初始化硬件

……

第二步:定义任务、消息及全局变量

……

第三步:编写中断服务程序

……

第四步:编写接收任务

……

第五步:编写发送任务

……

   至此,这一步所要完成的程序编写完毕,经过短暂的“纠结”,程序编译通过了,很庆幸,程序构思没有任何错误,调试一次通过 ^_^

六、结语

   首先解释一下为何用“纠结”来表述编译时遇到的问题。

   毕竟是第一次基于 uCOSII 编写一个完成具体任务的程序,而且一次涉及了那么多内容:信号量、消息队列、内存管理、中断等,略显不自信,所以编译一出错就怀疑写的有问题,OSMem 折腾了好长时间,最后是错在笔误,将 OSMemCreate 写成了 OSMemCreat 。

   调试时出现的问题是,将 UART3 误认为引出在 COM2 插座上,结果查 PCB 图发现没有,只好改用 UART1。

   这些都是非程序逻辑错误,看来通过 Step2 的消化理解,对 uCOSII 的功能有了初步的认识,基本可以使用了!再接再厉,完成其它几项基础任务。


2010年11月3日星期三

uCOS 学习随笔 StepbyStep-3—— 任务设计(基于STM32控制的第四代圆梦小车)PDF版本,含代码.pdf