0
点赞
收藏
分享

微信扫一扫

PID闭环控制、串口通信、舵机控制,OLED控制的笔记

在观看塔洛斯实验室的讲解后,记录其中的内容╰(*°▽°*)╯。

串口

串口:从定义讲:采用串行通信方式的扩展接口。可以全双工通信。串口通信,简单来说就是讲数据按位依次传输。

物理连接:

串口分为RXD和TXD两根线(也叫RX,TX),是英文receive external data和transmit external data。计算机是二进制的,所以串口发送的数据也是“0”和“1”组成的序列,但是串口发送的“0”和“1”需要经过发送方编码、接收方解码才可以变成人类可以看懂的语言。要想正确解码,需要抓住以下几点:

  1. 多长时间的高电平代表一个“0”或“1”?
  1. 波特率
  1. 几位代表一个字节?
  1. 传输字节长度
  1. 有没有校验位?
  1. 校验位:奇数校验、偶数校验
  1. 怎样代表着发送的结束?
  1. 停止位
  1. 是先发高位还是先发低位?
  1. MSB/LSB
  1. 一串“01”的组合怎样解码才能成自然语言?
  1. ASCII码

发送端和接收端只需要使用相同的编码方式,就可以相互通信了。

PID闭环控制、串口通信、舵机控制,OLED控制的笔记_OLED

void USART1_Init(u32 bound){    //USART3初始化启动
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); ///使能USART1,GPIOA时钟
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化工c寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启ENABLE/关闭DISABLE中断
USART_Cmd(USART1, ENABLE); //使能串口
}

舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机一共有三条线,正极、负极、信号线。舵机是通过脉冲看睹调制方式驱动(PWM)。

PID闭环控制、串口通信、舵机控制,OLED控制的笔记_串口_02PID闭环控制、串口通信、舵机控制,OLED控制的笔记_PID_03

简单的演示程序:

while(1){
u16 angle,i;
for (angle =200; angle >= 100;angle=angle - 1){
for (i = 0; i < 2 ; i++){
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay_uss(angle);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
delay_uss(2000-angle);
}
printf("%d\n",angle);
}
}

OLED

OLED是一种显示器件,其特点是由自发光点组成,在单片机中常用128*64(分辨率)。英文、数字最小可用8x8像素,但一般用8x16像素,汉字一般是16x16像素。

实际上OLED显示屏由两部分组成:显示屏+sh1106驱动芯片(厂家不同,型号也不同),发送的是IIC信号,由sh1106芯片解析。

  1. 字库从哪里来?
  1. 取模软件自动生成
  1. OLED显示函数需要自己写吗?
  1. 不需要,调用库就可以
  1. u8g2(BSD协议,中景园电子提供的库 ):​​https://github.com/olikraus/u8g2/wiki ​​
  2. LVGL(MIT协议,在stm32是需要移植的,Arduino和ESP不需要)​​:​​https://github.com/lvgl​​

PID

PID控制即比例-积分-微分控制,即通过对偏差进行比例-积分-微分控制,使得当前值趋于目标值的过程。一般来说,比例P控制是必须的,所以衍生出很多组合的PID控制器,如PD、PI、PID等。积分:一段时间内偏差的累计;微分:偏差的变化率,用于反馈当前的变化速率的控制

PID闭环控制、串口通信、舵机控制,OLED控制的笔记_PID_04

不过由于积分和微分是连续的,但实际不可能所以不要进行离散化,积分变为面积,微分变成两端点的斜率,记累加代替积分,一阶差分代替一阶微分,最后得到离散化公式。

PID闭环控制、串口通信、舵机控制,OLED控制的笔记_PID_05

PID闭环控制、串口通信、舵机控制,OLED控制的笔记_舵机_06

PID调节的口诀

参数整定找最佳,从小到大顺序查;

先是比例后积分,最后再把微分加;

曲线振荡很频繁,比例度盘要调大;

曲线漂浮绕大湾,比例度盘往小调;

曲线偏离回复慢,积分时间往下降;

曲线波动周期长,积分时间再加长;

曲线振荡频率快,先把微分降下来;

动差大来波动慢。微分时间应加长;

理想曲线两个波,前高后低4比1;

一看二调多分析,调节质量不会低。 

IIC协议

IIC协议,也叫I2C协议,是由两根线组成,分别是数据线sda(serial data)和时钟线scl(serial clock)。IIC总线上每个器件都有其地址可以选择是读取数据还是写入数据 OLED屏幕在IIC总线上固定地址:0x78

要想写入指令,要先发送0x00之后再发送写入的指令;

要想写入数据,要先发送0x40之后再发送写入的数据。

链接:​​​​https://www.bilibili.com/video/BV1yM4y1w7L7?spm_id_from=333.1007.top_right_bar_window_history.content.click​​​​

举报

相关推荐

0 条评论