在观看塔洛斯实验室的讲解后,记录其中的内容╰(*°▽°*)╯。
串口
串口:从定义讲:采用串行通信方式的扩展接口。可以全双工通信。串口通信,简单来说就是讲数据按位依次传输。
物理连接:
串口分为RXD和TXD两根线(也叫RX,TX),是英文receive external data和transmit external data。计算机是二进制的,所以串口发送的数据也是“0”和“1”组成的序列,但是串口发送的“0”和“1”需要经过发送方编码、接收方解码才可以变成人类可以看懂的语言。要想正确解码,需要抓住以下几点:
- 多长时间的高电平代表一个“0”或“1”?
- 波特率
- 几位代表一个字节?
- 传输字节长度
- 有没有校验位?
- 校验位:奇数校验、偶数校验
- 怎样代表着发送的结束?
- 停止位
- 是先发高位还是先发低位?
- MSB/LSB
- 一串“01”的组合怎样解码才能成自然语言?
- ASCII码
发送端和接收端只需要使用相同的编码方式,就可以相互通信了。
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)。
简单的演示程序:
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芯片解析。
- 字库从哪里来?
- 取模软件自动生成
- OLED显示函数需要自己写吗?
- 不需要,调用库就可以
- u8g2(BSD协议,中景园电子提供的库 ):https://github.com/olikraus/u8g2/wiki
- LVGL(MIT协议,在stm32是需要移植的,Arduino和ESP不需要):https://github.com/lvgl
PID
PID控制即比例-积分-微分控制,即通过对偏差进行比例-积分-微分控制,使得当前值趋于目标值的过程。一般来说,比例P控制是必须的,所以衍生出很多组合的PID控制器,如PD、PI、PID等。积分:一段时间内偏差的累计;微分:偏差的变化率,用于反馈当前的变化速率的控制
不过由于积分和微分是连续的,但实际不可能所以不要进行离散化,积分变为面积,微分变成两端点的斜率,记累加代替积分,一阶差分代替一阶微分,最后得到离散化公式。
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