【单片机学习笔记】(30):蓝牙通信、板球控制系统、串级PID

Debug方法

当外设多了之后,有些外设初始化不成功的话,先去用st—link调试,找到出问题的,再去调换一下初始化的顺序。别在那一直看代码空想

如果实在中断中调用的函数出问题,那就用led去把它放在相应函数的不同位置,看看能否正常执行过去!实在没思路,二分法也是不错的选择!注意变量赋值或者判断语句是否合适

给程序做了标记记得取消,否则编译每次都会编译全部文件,速度很慢

蓝牙通信

两个蓝牙模块HC-05配对---血泪史_micro_xx的博客-CSDN博客_两个蓝牙模块配对  参考连接

蓝牙也跟GSM模块一样,使用AT指令区操作的

波特率都是9600

两个蓝牙要是都是隔一段时间都同时闪亮几次,说明就已经配对成功了,蓝牙主机可以向蓝牙从机发送数据了

连接密码都改成6632

蓝牙A  地址:98D3:61:F6199D   蓝牙B 地址:98D3:21:F7595C

背面塑料被弄花的是蓝牙B,它是从机

直接用PC操控两个蓝牙配对成功。

如果用单片机来一个发送,一个接收的话,则需结合AT指令进行编程。

或者把串口的发送和接收程序写好

usart3进行蓝牙主机发送,usart2进行蓝牙从机接收

实在不会搞数据包,协议这些的话,那就直接通过单片机发送几个数字,另一个单片机通过判断它来执行相应操作吧,先试试可不可靠再说。以后再去补串口通信协议这部分知识点吧。

应该在从机那里设置一个串口接收中断就行。(如果通过蓝牙控制什么东西,或者想用串口1显示到电脑上,直接在连接蓝牙从机的串口二的接收中断里面编写业务代码

板球控制系统

板球控制系统制作_weixin_40909092的博客-CSDN博客_板球控制系统

【自动化毕业设计】基于机械视觉控制的板球控制装置_automan05的博客-CSDN博客_板球控制

(参考资料链接)

  外环一般是最后的控制期望(想要得到的效果)

要学会使用积分分离积分过饱和处理

注意内环控制频率外环控制控制频率要高,

 

 

喵呜教程中的,是采集完要输入的数据后来个低通滤波效果会更好??查资料理解一下。

板球串级PID

串级 PID 为什么外环输出是内环的期望?(和我之前对串级PID的总结一样)_TYINY的博客-CSDN博客_串级pid内环和外环怎么确定

(参考资料链接)

外环输出 是 内环的目标值。

外环输出 是 内环误差(内环目标值 - 内环实际值)经过PID计算得出的值

理解消化野火直流有刷电机多闭环控制教程代码,然后做出 内环速度环PD控制外环位置环的PI控制串级PID控制

位置环的输出上限:Target_speed_max     3   (-3~3)

速度环的输出上限: Angle     40            (-40~40)

往回算kp,ki,kd的大概值。

临界比例度法:先去掉积分和微分部分,将P值逐渐增大到系统临界震荡,然后加入积分,对P适当缩小。

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-29
好的,如果您想要在STM32上实现蓝牙通信的话,您可以使用STM32提供的内置蓝牙模块,或者使用外部蓝牙模块(例如HC-05、HC-06等),并通过UART串口与STM32进行通信。 以下是一个使用STM32内置蓝牙模块(例如STM32WB55)进行蓝牙通信的示例代码: ```c #include "stm32wbxx.h" #include "stm32wbxx_hal.h" #define UART_TX_PIN GPIO_PIN_9 #define UART_RX_PIN GPIO_PIN_10 UART_HandleTypeDef huart1; void UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = UART_TX_PIN|UART_RX_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 处理接收到的蓝牙数据 } } int main(void) { HAL_Init(); UART_Init(); while (1) { // 发送蓝牙数据 uint8_t data[] = {0x01, 0x02, 0x03}; HAL_UART_Transmit(&huart1, data, sizeof(data), 1000); // 等待接收蓝牙数据 HAL_UART_Receive_IT(&huart1, data, sizeof(data)); HAL_Delay(100); } } ``` 以上代码中,我们使用了STM32的UART串口与蓝牙模块进行通信,通过HAL_UART_Transmit()函数将数据发送到蓝牙模块,通过HAL_UART_Receive_IT()函数开启中断接收来自蓝牙模块的数据。 当然,具体的代码实现还需要根据您使用的蓝牙模块进行相应的调整。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值