一共有5个任务
任务1:CS100A_task1 靠近检测 优先级7 堆栈分配512(*4)字节
任务2:CS100A_task2 溢出检测 优先级7 堆栈分配512(*4)字节
任务3:Motor_task 盖子打开关闭 优先级10 堆栈分配256(*4)字节
任务4:YD5010_task 风扇转动 优先级11 堆栈分配256(*4)字节
任务5:ESP8266_task 联网任务 优先级10 堆栈分配256(*4)字节
关于超声波测量距离的技术细节:
使用TIM3/TIM2输入捕获功能完成靠近检测与溢出检测
我们主动给出Triq信号,等待超声波测完距离后的回响时间echo。那么我们需要做的就是将这个方波echo高电平的时间给他测量出来。简单来说,就是我们要测量一个方波输入信号的高电平持续时间delaytime。
下面这个段不用看,没什么用,主要是分析我写的代码
使用stm32自带的定时器输入捕获的功能。我们将echo的输入,通过直连和交叉连接的方式,将通道二的输入信号变成两路进去,直连下降沿触发,交叉沿上升沿触发。原先这个功能是用来同时测量PWM输入的频率与占空比。好吧但实际上我们也没用到这个功能。
我们需要的上升沿触发,当上升沿触发我们主动开启一个捕获中断后进行,在中断函数中实现立即设置下降沿,静静等待下一次下降沿触发捕获中断。上升沿计算一个Atime(us),下降沿记录一个Btime(us),两者之间的差值就是echo高电平的持续时间。
使用从模式自动将自身的计数器CNT清零,顺序是先捕获CNT的值到CCR中,再将CNT清零重新计数。当CRR计数N达到我们设定的最大值ARR的时候,CRR清0产生更新中断,update_count++。
找到中断号后,进入中断服务函数,我们需要用中断临界区将内部代码包含住。保护代码段不会被打断。
捕获中断测量的原理:用stm32自己的fc,去测量方波的持续长度。N/fc。
OLED显示公式(将距离拆成小数和整数部分):
关于联网技术细节:
订阅主题:阿里云发布主题后,接收RX中断数据,串口中断(RX读中断)服务函数GPIOA_Pin_9:保存到咋们定义的REC字符数组当中。
发布主题:创建任务定时发布主题,以便阿里云获取数据
这个数据的格式是什么样子的呢?我们的消息传输协议是MQTT协议,使用 TCP/IP 提供网络连接。简单来说就是esp作为一个客户端,连接到wifi后呢,通过这wifi去连接到外网阿里云物联网平台。连接好之后需要通信传数据。遵循这个协议传输数据。简单说MQTT就是一个主题,订阅者获取主题消息,发布者放置消息再主题中。
那么我们需要阿里云平台和esp都能作为发布者和订阅者,就需要两个主题。一个主题是阿里云发布消息操作stm32,一个主题是阿里云提取stm32消息。
我们的esp烧写了透传,也就是esp负责不对数据进行包装修改的串口传输(原封不动)。