导图社区 STM32F103
STM32单片机相关知识点,B站正点原子教程部分知识梳理。介绍了各模块的基本原理及32单片机代码实现,包括LED、TFTLCD、DS18B20、USART、HC05、外部中断、定时器、PWM、PID等。
编辑于2023-01-07 21:11:10 江苏省电子信息大学生竞赛知识,包括数学建模竞赛、电子设计竞赛等
【全】电子信息专业课,211本科课堂笔记,内容详尽,鞭辟入里,深入浅出
电子信息重点专业课知识点整理,211本科课堂笔记,内容详尽,鞭辟入里,深入浅出
信号与系统知识点总结。具体包括:信号与系统的基本概念、LTI系统的时域分析、连续时间信号与系统的频域分析、离散时间信号与系统的频域分析、采样、调制与通信系统、连续时间信号与系统的复频域分析(拉普拉斯变换)、z变换与离散时间LTI系统。 导图主要基于浙江大学胡浩基教授的课程、浙江大学信号与系统学习指导。教材:《信号与系统(第二版)》化学工业出版社,于慧敏主编。浙江大学信电学院电子信息考研842/844适用。 导图共3万余字,集毕生功力之大成,非常非常全面、细致,适用于电子、通信专业的学生。
数字系统设计、数字电路、数字电子技术知识点总结。具体包括:数制和码制、逻辑代数基础、门电路、组合逻辑电路、时序逻辑电路、半导体逻辑电路、脉冲波形的产生和整形,以及微控制器设计。 导图主要基于清华大学王红教授的课程、浙江大学信电学院的微控制器补充讲义。教材:《数字电子技术基础(第六版)》高等教育出版社,阎石主编。浙江大学信电学院电子信息考研842/844适用。 导图共4万余字,集毕生功力之大成,非常非常全面、细致,适用于电子、通信专业的学生。
驾考科目一知识点,璇姐科目一3小时精髓课课程笔记,适用于科目一驾驶员理论考试的考生,干货满满,有需要的朋友赶紧收藏吧!
社区模板帮助中心,点此进入>>
电子信息大学生竞赛知识,包括数学建模竞赛、电子设计竞赛等
【全】电子信息专业课,211本科课堂笔记,内容详尽,鞭辟入里,深入浅出
电子信息重点专业课知识点整理,211本科课堂笔记,内容详尽,鞭辟入里,深入浅出
信号与系统知识点总结。具体包括:信号与系统的基本概念、LTI系统的时域分析、连续时间信号与系统的频域分析、离散时间信号与系统的频域分析、采样、调制与通信系统、连续时间信号与系统的复频域分析(拉普拉斯变换)、z变换与离散时间LTI系统。 导图主要基于浙江大学胡浩基教授的课程、浙江大学信号与系统学习指导。教材:《信号与系统(第二版)》化学工业出版社,于慧敏主编。浙江大学信电学院电子信息考研842/844适用。 导图共3万余字,集毕生功力之大成,非常非常全面、细致,适用于电子、通信专业的学生。
数字系统设计、数字电路、数字电子技术知识点总结。具体包括:数制和码制、逻辑代数基础、门电路、组合逻辑电路、时序逻辑电路、半导体逻辑电路、脉冲波形的产生和整形,以及微控制器设计。 导图主要基于清华大学王红教授的课程、浙江大学信电学院的微控制器补充讲义。教材:《数字电子技术基础(第六版)》高等教育出版社,阎石主编。浙江大学信电学院电子信息考研842/844适用。 导图共4万余字,集毕生功力之大成,非常非常全面、细致,适用于电子、通信专业的学生。
驾考科目一知识点,璇姐科目一3小时精髓课课程笔记,适用于科目一驾驶员理论考试的考生,干货满满,有需要的朋友赶紧收藏吧!
STM32F103
LED
GPIO工作方式
输入模式
输入浮空模式(均关)
输入上拉模式(VDD开)
输入下拉模式(VSS开)
模拟模式(外部模拟量→内部数字量)
输出模式
开漏输出 (输出强低电平)
开漏输出模式
高电平不开P-MOS,IO端口由外部上/下拉决定
开漏复用输出模式
推挽输出 (输出强高低电平)
推挽输出模式
高电平开P-MOS
推挽复用输出模式
GPIO相关配置寄存器
1. 端口配置低寄存器 (GPIOx_CRL)
每四位控制一个IO口,控制0~7
CNFy:配置位,怎样输入/输出
MODEy:模式位,输入还是输出
2. 端口配置高寄存器 (GPIOx_CRH)
每四位控制一个IO口,控制8~15
3. 端口输入数据寄存器 (GPIOx_IDR)
低16位每位控制一个IO口
4. 端口输出数据寄存器 (GPIOx_ODR)
低16位每位控制一个IO口
决定上下拉输入
5. 端口位设置/清除寄存器 (GPIOx_BSRR)
低16位:为1设置,为0不影响
高16位:为1清除,为0不影响
6. 端口位清除寄存器 (GPIOx_BRR)
低16位为1清除,为0不影响
STM32引脚
端口复用:通用IO口→外设引脚
最大限度利用端口资源
端口重映射:功能引脚→其他引脚
方便布线
软件实现
led.c
操作
1. 使能时钟
2. 初始化IO口模式
GPIO_Pin 端口设置
GPIO_Mode 输出模式
GPIO_Speed IO口速度设置
GPIO_Init();
3. 操作IO口输出高低电平
库函数
GPIO_SetBits();
GPIO_ResetBits();
寄存器
GPIOA->BRR低
GPIOA->BSRR高
位带操作
LED0=1;
LED1=1;
led.h
#ifndef 避免重复
#define位带操作
main.c
初始化
delay
led(与led连接的硬件接口)
Stm32_Clock_Init(9);寄存器版本初始化系统时钟
while
输出高低电平
延时
TFTLCD
简介
步骤设置
1.设置连接的IO
2.初始化LCD模块
3.显示字符数字(重复)
软件实现
ILI9xx.c lcd.c
重要结构体
LCD长宽
LCD ID(驱动IC型号)
LCD横竖屏状态
底层接口函数
1. 写数据函数
LCD_WR_DATA
LCD_WR_DATAX
拿时间换空间,减少宏定义
2. 写寄存器值函数LCD_WR_REG
写入命令:LCD_RS=0
写入数据:LCD_RS=1
3. 读数据函数LCD_RD_DATA
4. 写寄存器内容函数LCD_WriteReg
5. 读寄存器内容函数LCD_ReadReg
6. 坐标设置函数LCD_SetCursor
根据不同ID初始化代码
7. 画点函数LCD_Drawpoint
LCD_SetCursor(x,y); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入 GRAM
LCD_WR_DATA(POINT_COLOR);
8. 读点函数LCD_ReadPoint
全部GRAM占用空间值太大
先读原来的值,再写入新的值
读取TFTLCD模块数据
9. 字符显示函数LCD_ShowChar
x,y:起始坐标
num:字符
size:字体大小(12/16/24)
mode:叠加方式(1),非叠加方式(0)
10. 初始化函数LCD_Init
1. 初始化GPIO
2. 读取LCD ID
3. 用printf打印LCD ID,用到串口1故必须初始化串口1
4. 根据不同ID初始化代码
LCD_Display_Dir(0)//默认为竖屏
LCD_LED=1//点亮背光
LCD_Clear(WHITE)//清屏
lcd.h
重要结构体(参数集)
extern
lcddev管理重要参数
画笔颜色
背景色
define
LCD端口定义,使用快速IO口控制
数据输入
数据输出
扫描方向定义
LCD分辨率
LCD驱动参数
main.c
头文件
led
sys文件夹
lcd
定义变量
x=0
lcd_id[12]
初始化
delay
uart_init(9600)
LED
LCD
sprintf将LCD ID打印到lcd_id数组
while
switch语句切换背景颜色
POINT_COLOR设置画笔颜色
LCD_Showstring显示字符串
DS18B20
简介
技术性能特征
1. 单总线接口方式(一根数据线DQ),抗干扰
2. 范围-55°C~+125°C,精度±0.5°C
3. 多点组网:最多并联8个
4. 工作电源:3.0~5.5V
5. 不需外围元件
6. 测量结果以9~12位数字量方式串行发送
通信方式:半双工通信
信号类型
1. 复位脉冲
2. 应答脉冲(自行返回同步信号)
3. 写0
4. 写1
5. 读0
6. 读1
命令和数据:字节的低位在前
软件实现
ds18b20.h
define
IO方向设置
操作CRL寄存器
IO操作函数
PA0,位带操作
DS18B20初始化函数
ds18b20.c
1. 复位脉冲(复位DS18B20) DS18B20_RST
1. 低电平(主机输出)至少480us,产生复位脉冲
2. 高电平(主机释放总线)15~60us,进入接收模式(Rx)
3. 低电平(DQ拉低总线)60~240us,产生低电平应答脉冲
2. 应答信号(检测是否存在) DS18B20_Check
1. while语句,200us内等待DQ拉低
2. while语句
拉低时间>240us:不存在
拉低时间60~240us:存在
3. 写时序(MCU→DQ)读至少60us,恢复至少1us DS18B20_Write_Byte
写1时序:低2us,高60us
写0时序:低60us,高2us
4. 读时序(DQ→MCU)读至少60us,恢复至少1us DS18B20_Read_Bit
1. 低,主机输出2us
2. 高,主机输入12us
3. 读50us
5. 读取时序(一个字节) DS18B20_Read_Byte
for循环8次
6. 开始温度转换 DS18B20_Start
7. 读取温度 DS18B20_Get_Temp
前5位:符号位
>0:为0
<0:为1
其余13位
取反加1
乘0.0625
8. DS18B20初始化函数 DS18B20_Init
main.c
1. 头文件
1.1. led
1.2. sys文件夹
1.3. lcd
1.4. ds18b20
2. 定义变量
2.1. t=0
2.2. temperature
3. 初始化
3.1. delay
3.2. uart_init(9600)
3.3. LED
3.4. LCD
4. 显示字符串
5. DS18B20初始化,并检测是否存在
6. while
6.1. 每100ms读取一次数据
6.2. 正负转换
6.3. 整数、小数部分分开显示
USART
常用寄存器
USART_SR状态寄存器
USART_DR数据寄存器
低9位
TDR寄存器:提供了内部总线和输出移位寄存器之间的并行接口
RDR寄存器:提供了内部总线和输入移位寄存器之间的并行接口
高24位保留
USART_BRR波特率寄存器
位
位31:16保留
位15:4 USARTDIV的整数部分
直接存
位3:0 USARTDIV的小数部分
乘16再存
波特率计算方法
串口波特率寄存器USART1->BRR
USART分频器除法因子USARTDIV
PCLK1:用于串口2345
PCLK2:用于串口1
USART_CR控制寄存器
usart文件夹
usart.c
串口1初始化函数 uart_init
1. 使能时钟
1.1. USART1
1.2. GPIOA
1.3. 复用功能
2. 初始化IO口模式
2.1. GPIO_Pin 端口设置
2.2. GPIO_Mode 输出模式
2.3. GPIO_Speed IO口速度设置
2.4. GPIO_Init();
3. NVIC中断配置
3.1. 对应中断通道
3.2. 抢占优先级3
3.3. 子优先级3
3.4. IRQ通道使能
3.5. NVIC_Init中断优先级配置
4. USART初始化设置
4.1. 波特率
4.2. 字长:8位
4.3. 停止位:1个
4.4. 奇偶校验位:无
4.5. 硬件数据流控制:无
4.6. 收发模式:Rx|Tx
4.7. USART_Init初始化串口
5. USART_ITConfig开启中断
6. USART_Cmd使能串口
串口1中断响应函数 USART1_IRQHandler
USART_GetITStatus判断是否接受中断
USART_ReceiveData读取串口接受到的数据
printf函数支持
USART_RX_BUF[]数组
SYSTEM_SUPPORT_OS
调用(中断嵌套处理)
OSIntEnter
OSIntExit
接收状态寄存器USART_RX_STA
bit13~0
接收到的有效数据个数
bit14
接收到0X0D置1
bit15
接收到0X0A置1
usart.h
EN_USART1_RX
为1开启串口接收
为0关闭
USART_REC_LEN
软件实现
usart.c
1. 使能时钟
USART1
GPIOA
2. 串口复位USART_DeInit(非必须)
3. 初始化IO口模式GPIO_Init
4. USART初始化设置USART_Init
5. NVIC中断配置NVIC_Init
6. USART_ITConfig开启中断
7. USART_Cmd使能串口
stm32f10x_usart.c
串口数据收发
发送数据到串口USART_SendData
接受数据USART_ReceiveData
串口传输状态获取
USART_GetFlagStatus
USART_ClearITPendingBit
main.c
头文件
led
sys文件夹
定义变量
t
len
times=0
初始化
delay
设置中断分组
uart_init(9600)
LED
while
if(USART_RX_STA接收到数据)
得到长度
打印数据
按位存储到DR
等待发送结束
换两行
USART_RX_STA置0
else
每50s/2s打印提示语句
HC05
简介
模块引脚
LED
配对成功输出高
配对失败输出低
KEY
用于进入AT状态
高电平有效(悬空默认为低电平)
RXD
模块串口接收脚,接单片机的TXD
TXD
模块串口发送脚,接单片机的RXD
GND
VCC
3.3~5.0V
电气特性
支持波特率
4800,9600,1382400等
主从一体
通信距离
工作温度
-25°C~75°C
工作电流
配对中:30~40mA
配对完毕未通信:1~8mA
通信中:5~20mA
模式
模块模式
AT指令模式:设置和查询相关参数
串口数据透传
STA状态指示灯模式
STA慢闪
1s闪1下
上电同时/之前,KEY接VCC
AT状态
波特率固定为38400
8位数据位,1位停止位
STA快闪
1s闪2下
上电时,KEY悬空或接GND
可配对状态
再将KEY拉高进入AT,仍快闪
波特率与通信波特率一致,默认9600
STA双闪
2s闪1次,一次闪2两下
AT指令
设置参数
修改模块主从AT+ROLE=0从机/1主机
设置记忆AT+CMODE=0/1
修改通信波特率AT+UART=波特率,停止位,校验位
修改密码AT+PSWD=(4个字节)
修改蓝牙模块名字AT+NAME=(ASCII字符,最多32个)
查询参数
AT+<CMD>?
软件实现
usart2.c
1. 串口2的初始化
2. 串口2的printf函数
3. 串口2的接收处理
hc05.c
1. 初始化连接的IO口:HC05_Init
2. 获取模块主从状态:HC05_Get_Role
0:从机
1:主机
0xff:获取失败
3. 通用设置指令:HC05_Set_Cmd
0:设置成功
其他:设置失败
4. USMART调试:HC05_CFG_CMD
hc05.h
HC05_KEY
蓝牙控制KEY信号(PC4)
HC05_LED
蓝牙连接状态信号(PA4)
test.c
1. 头文件
1.1. led
1.2. sys文件夹
1.3. lcd
1.4. ds18b20
1.5. hc05
1.6. key
1.7. 串口2
1.8. string
2. 子函数
2.1. 显示主从状态HC05_Role_Show
2.2. 显示连接状态HC05_Sta_Show
3. 定义变量
3.1. u
3.2. key
3.3. sendbuf[20]
3.4. =0
3.4.1. sendmask
3.4.2. sendcnt
3.4.3. reclen
4. 初始化
4.1. delay
4.2. 设置中断分组(两位抢占,两位响应)
4.3. uart
4.4. LED
4.5. KEY
4.6. LCD
5. 显示提示字符
6. 初始化模块并检验存在
7. 显示主从状态
8. while
8.1. 检测按键按下
8.1.1. 按下WK_UP
8.1.1.1. HC05_Set_Cmd切换主从设置
8.1.1.2. HC05_Role_Show显示主从状态
8.1.2. 按下KEY0
8.1.2.1. sendmask取反,切换发送状态
8.1.2.2. send:后面清屏
8.1.3. 其他
8.1.3.1. 延时10ms
8.2. 每0.5s发送一次
8.2.1. if(sendmask)定时发送
8.2.2. 连接状态显示
8.3. USART2_RX_STA接收数据
8.3.1. 清屏
8.3.2. 得到数据长度
8.3.3. 加入结束符
8.3.4. 控制LED1检测
8.3.5. 显示接收的字符串
8.3.6. USART2_RX_STA置0
外部中断
NVIC相关寄存器
ISER[8]中断使能寄存器组
8*32=256个中断
STM32F103仅支持前60位
ISER[0]bit0~31
ISER[1]bit0~27(对应32~59位)
ICER[8]中断除能寄存器组
置1将正在使能的中断除能
ISPR[8]中断挂起控制寄存器组
置1将正在进行的中断挂起
ICPR[8]中断解挂控制寄存器组
置1将正在挂起的中断解挂
IABR[8]中断激活标志位寄存器组
置1表示对应的中断正在被执行,执行完后由硬件自行清零
IP[240]中断优先级控制寄存器组
19个外部中断
线0~15:对应外部IO口的输入中断
EXTI15对应Px15(x=A,B,C,D,E,F,G)
线16:连接到PVD输出
线17:连接到RTC闹钟事件
线18:连接USB唤醒事件
外部中断设置步骤
1. 初始化IO口为输入
2. 开启IO口复用时钟, 设置中断线和GPIO映射关系
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2)
3. 设置中断初始化参数 EXTI_InitTypeDef
EXTI_Line中断线
EXTI_Line0~15
EXTI_Mode中断模式
EXTI_Mode_Interrupt中断
EXTI_Mode_Event事件
EXTI_Trigger触发方式
EXTI_Trigger_Falling下降沿触发
EXTI_Trigger_Rising上升沿触发
EXTI_Trigger_Rising_Falling任意电平触发
EXTI_LineCmd使能中断线
4. 设置NVIC中断优先级
调用函数NVIC_PriorityGroupConfig() 以确定组号,设置中断分组
组号0
0位抢占,4位响应
组号1
1位抢占,3位响应
组号2
2位抢占,2位响应
组号3
3位抢占,1位响应
组号4
4位抢占,0位响应
对用到的中断调用NVIC_Init 以设置其中断优先级别
NVIC_IRQChannel中断名
NVIC_IRQChannelPreemptionPriority抢占优先级
NVIC_IRQChannelSubPriority子优先级
NVIC_IRQChannelCmd是否使能
5. 编写中断服务函数
共6个外部中断函数
0~4单列,5~9共用1个,10~15共用一个
EXTI0_IRQHandler
EXTI9_5_IRQHandler
编写时常用函数
判断中断是否发生: EXTI_GetITStatus(EXTI_Line2)!=RESET
清除某个中断线上的中断标志位: EXTI_ClearITPendingBit(EXTI_Line2)
软件设计
exti.c
EXTIX_Init:外部中断初始化函数
1. KEY_Init初始化外部中断输入的IO口
2. RCC_APB2PeriphClockCmd()使能复用功能时钟
3. 设置中断线和GPIO的映射关系
4. 初始化中断线
中断服务函数
EXTI0_IRQHandler:WK_UP中断检测
延时10ms消抖
检测WK_UP是否为高电平,执行操作
ClearPendingBit清除中断请求
EXTI9_5_IRQHandler:KEY0中断检测
KEY0低电平触发,下降沿
EXTI15_10_IRQHandler:KEY1中断检测
KEY1低电平触发,下降沿
exti.h
EXTIX_Init初始化各个外部中断
main.c
头文件
led
sys文件夹
key
exti
初始化
delay
设置中断分组
uart_init(9600)
LED
EXTIX
点亮LED0
while
每1000ms打印一个"OK"
定时器中断
定时器分类
TIME1/TIME8:高级定时器
TIME2~TIME5:通用定时器
TIME6/TIME7:基本定时器
通用定时器简介
由一个可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成
用于
测量输入信号的脉冲长度(输入捕获)
产生输出波形(输出比较和PWM)
等
寄存器
1. 控制寄存器1(TIMx_CR1)
位15:10保留,始终读为0
位9:8时钟分频因子CKD[1:0]
位7自动重装载预装载允许位ARPE
0:TIMx_ARR寄存器没有缓冲
1:TIMx_ARR寄存器被装入缓冲器
位6:5选择中央对齐模式CMS[1:0]
位4方向DIR
0:计数器向上计数
1:计数器向下计数
位3单脉冲模式OPM
0:在发生更新事件时,计数器不停止
1:在生下一次更新事件(清除CEN位)时, 计数器停止
位2更新请求源URS
位1禁止更新UDIS
位0使能计数器CEN
0:禁止计数器
1:使能计数器
2. 中断使能寄存器(TIMx_DIER)
位0更新中断允许位UIE
0:禁止由于更新事件所产生的中断
1:允许由于更新事件所产生的中断
3. 预分频寄存器(TIMx_PSC)(对时钟进行分频, 然后提供给计数器,作为计数器的时钟)
定时器的时钟来源
内部时钟(CK_INT)
外部时钟模式1:外部输入脚(TIx)
外部时钟模式2:外部触发输入(ETR)
内部触发输入(ITRx):A定时器为B定时器提供时钟
4. TIMx_CNT
定时器的计数器,存储了当前定时器的计数值
5. 自动重装载寄存器(TIMx_ARR)
对应两个寄存器:一个可操作的,一个不可操作的(影子寄存器)
APRE=0:预装载寄存器的内容可以随时传送到影子寄存器,二者连通
APRE=1:每一次更新事件(UEV)时,才把预装载寄存器的内容传送到影子寄存器
6. 状态寄存器(TIMx_SR)
用来标记当前与定时器相关的各种事件/中断是否发生
定时器设置步骤
1. TIM3时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE)
2. 初始化各参数
TIM_TimeBaseInitTypeDef
TIM_Prescaler设置分频系数
=psc
TIM_CounterMode设置计数方式
向上计数方式Up
向下计数方式Down
中央对齐计数方式
TIM_Period设置自动重载计数周期值
=arr
TIM_ClockDivision设置时钟分频因子
=0
TIM_RepetitionCounter(高级定时器用)
3. 设置TIM3_DIER允许更新中断
TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE)
选择定时器号
TIM1~TIM17
指明使能的定时器中断的类型
更新中断TIM_IT_Update
触发中断TIM_IT_Trigger
失能/使能
4. TIM3中断优先级设置
5. 使能TIM3
TIM_Cmd(TIM3,ENABLE)
6. 编写中断服务函数
判断定时器3是否发生更新(溢出)中断
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){}
清除定时器3的更新标志位
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
软件设计
timer.c
TIM3_Int_Init:中断初始化函数
6个步骤(见上)
两参数
arr:自动重装值
psc:时钟预分频数
TIM3的时钟为72M(时钟主频)
计算中断时间:Tout=((arr+1)*(psc+1))/Tclk
Tclk:输入时钟频率(Mhz)
Tout:溢出时间(us)
计数频率 =Tclk/(psc+1)
Tclk:72M(hz)
计数频率(hz),即每秒可计多少数
TIM3_IRQHandler:中断服务函数
main.c
头文件
led
sys文件夹
timer
初始化
delay
设置中断分组
uart_init(9600)
LED
TIM3_Int_Init(4999,7199)
10Khz的计数频率,计数到5000为500ms(溢出)
(由arr、psc、时钟主频72Mhz,可推知计数频率(hz)和溢出时间(us))
while
LED0电平切换
PWM
PWM简介
原理
CCRx:输出占空比
ARR:输出频率
定时器
TIM1,8:7路PWM输出
TIM2~5:4路PWM输出
TIM6,7:无法产生PWM输出
寄存器
1. 捕获/比较模式寄存器(TIMx_CCMR1/2)
组成
TIMx_CCMR1控制CH1和2
TIMx_CCMR2控制CH3和4
位
输出/输入时某些位功能不一样,本实验用输出模式
模式设置位OCxM:PWM模式设置为110/111(输出电平极性相反)
方向(输入/输出)设置位CCxS:默认为0,即作为输出使用
2. 捕获/比较使能寄存器(TIMx_CCER)
位0输入/捕获1输出使能位CC1E:置1使PWM从IO口输出
3. 捕获/比较寄存器(TIMx_CCR1~4)
共4个,对应4个通道CH1~4
在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生响应动作;通过修改这个寄存器的值,控制PWM的脉宽
4. 刹车和死区寄存器(TIMx_BDTR)
仅高级定时器需配置该寄存器
最高位MOE置1,则高级定时器的PWM正常输出
PWM配置步骤
1. 开启TIM1时钟,配置PA8为复用输出
RCC_APB1PeriphClockCmd(PCC_APB1Periph_TIM1,ENABLE)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
2. 设置TIM1的ARR和PSC
周期小于50Hz时,会明显感觉到灯闪烁
TIM_TimeBaseInit
TIM_Prescaler设置分频系数
=psc
TIM_CounterMode设置计数方式
向上计数方式Up
向下计数方式Down
中央对齐计数方式
TIM_Period设置自动重载计数周期值
=arr
TIM_ClockDivision设置时钟分频因子
=0
3. 设置TIM1_CH1的PWM模式及通道方向, 使能TIM1的CH1输出
配置TIM1_CCMR1的相关位来控制TIM1_CH1的模式
通过函数TIM_OC1Init()~TIM_OC4Init()来设置PWM通道
TIM_OCInitTypeDef
TIM_OCMode设置模式是PWM还是输出比较
PWM2
TIM_OutputState设置比较输出使能, 也就是使能PWM输出到端口
Enable
TIM_OCPolarity设置极性是高还是低
High
TIM_Pulse设置待装入捕获比较寄存器的脉冲值
=0
4. 使能TIM1
CH1预装载使能
TIM1在ARR上的预装载寄存器使能
TIM_Cmd(TIM1,ENABLE)
5. 设置MOE输出,使能PWM输出
仅高级定时器需要
TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE主输出使能
6. 修改TIM1_CCR1来控制占空比
TIM_SetCompare1(TIM_TypeDef* TIMx,uint16_t Compare1);
软件设计
pwm.c
5个步骤(见上)
main.c
头文件
led
sys文件夹
pwm
定义变量
led0pwmval=0
dir=1
初始化
delay
LED
TIM3_PWM_Init(899,0)
不分频,PWM频率=72000/(899+1)=80Khz
while
delay
控制led0pwmval从0到300循环
TIM_SetCompare1(TIM1,led0pwmval);
PID
原理
闭环控制
目标量→偏差量→PID→执行量→执行器
执行量=P+I+D
比例P
1. 偏差量、执行量有数值范围,如0、1;1~9,基础运行能力
2. 公式
2.1. 偏差量=目标量-小球位置
2.2. 比例P=偏差量*比例P系数
3. 效果
3.1. 偏移越大,比例越大
4. 缺点
4.1. 数值固定
4.2. 不辨情形
5. 调参
5.1. 小:不能到目标
5.2. 大:超出目标
积分I
1. 增幅器:“累加经验”,补足P过小的问题(加快回正),小偏差量起效(解决小偏差)
2. 公式
2.1. 偏差量=目标量-小球位置
2.2. 积分I=积分I(上一次)+偏差量*积分I系数
3. 效果
3.1. 偏移大:逐步积分达到目标量
3.2. 偏移小(目标量左右移动):积分趋于0,几乎没有效果
4. 缺点
4.1. 可能无限大,导致系统故障
5. 限制
5.1. 范围限制(最值)
5.2. 不运行时清零
6. 调参
6.1. 小:不能到目标,小偏差量不能回正
6.2. 大:超出目标,系统表现迟钝
6.3. 可减小P
微分D
1. 抑制器:“预测未来”,阻止超出目标
2. 公式
2.1. 偏差量=目标量-小球位置
2.2. 微分D=(偏差量-上一次偏差量)*微分D系数
偏差量-上一次偏差量:下一次偏差量的预测值
2.3. 上一次偏差量=偏差量
3. 效果
3.1. 缓慢移动:作用弱
3.2. 快速移动:作用强(提前控制)
4. 调参
4.1. 小:超出目标
4.2. 大:目标范围附近高频抖动,对误差敏感
4.3. 可增加P