烟台网站建设设计,零陵区住房和城乡建设局网站,房地产网站建设需求说明书,重庆綦江网站制作公司推荐1. ADC介绍
ADC是什么#xff1f;
Analog-to-Digital Converter#xff0c;指模拟/数字转换器
ADC的性能指标
量程#xff1a;能测量的电压范围分辨率#xff1a;ADC能辨别的最小模拟量#xff0c;通常以输出二进制数的位数表示#xff0c;比如#xff1a;8、10、1…1. ADC介绍
ADC是什么
Analog-to-Digital Converter指模拟/数字转换器
ADC的性能指标
量程能测量的电压范围分辨率ADC能辨别的最小模拟量通常以输出二进制数的位数表示比如8、10、12、16 位等位数越多分辨率越高一般来说分辨率越高转化时间越长转换时间从转换开始到获得稳定的数字量输出所需要的时间称为转换时间
ADC特性
12 位精度下转换速度可高达 1MHZ供电电压V SSA 0VV DDA 2.4V~3.6VADC 输入范围VREF- ≤ VIN ≤ VREF0–3.6V采样时间可配置采样时间越长转换结果相对越准确但是转换速度就越慢ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中
ADC通道
总共 2 个 ADCADC1ADC2每个 ADC 有 18 个转换通道: 16 个外部通道、 2 个内部通道温度传感器、内 部参考电压。 外部的 16 个通道在转换时又分为规则通道和注入通道其中规则通道最多有 16 路注入通道最多有 4 路。规则组正常排队的人注入组有特权的人军人、孕妇
ADC转换顺序
每个 ADC 只有一个数据寄存器16 个通道一起共用这个寄存器所以需要指定规则转换通道的转换顺序。规则通道中的转换顺序由三个寄存器控制SQR1、SQR2、SQR3它们都是 32 位寄存器。SQR 寄存器控制着转换通道的数目和转换顺序只要在对应的寄存器位 SQx 中写入相应的通道这个通道就是第 x 个转换。 和规则通道转换顺序的控制一样注入通道的转换也是通过注入寄存器来控制只不过只有一个 JSQR 寄存器 来控制控制关系如下 注入序列的转换顺序是从JSQx[ 4 : 0 ]x4-JL[1:0]开始。只有当JL4的时候注入通道的转换顺序才会按 照JSQ1、JSQ2、JSQ3、JSQ4的顺序执行。
ADC触发方式
通过向控制寄存器ADC-CR2的ADON位写1来开启转换写0停止转换。也可以通过外部事件如定时器进行转换。
ADC转化时间
ADC 是挂载在 APB2 总线PCLK2上的经过分频器得到 ADC 时钟ADCCLK最高 14 MHz。转换时间采样时间12.5个周期12.5 个周期是固定的一般我们设置 PCLK272M经过 ADC 预分频器能分频到最大的时钟只能是 12M 采样周期设置为 1.5 个周期算出最短的转换时间为 1.17us。
ADC转化模式
扫描模式
关闭扫描模式只转换 ADC_SQRx 或 ADC_JSQR 选中的第一个通道打开扫描模式扫描所有被 ADC_SQRx 或 ADC_JSQR 选中的所有通道
单次转换/连续转换
单次转换只转换一次连续转换转换一次之后立马进行下一次转换
2. 使用ADC读取烟雾传感器的值351.55
STM32CubeMx工程配置 代码21.adc_test/MDK-ARM uint32_t smoke_value 0;
while (1)
{HAL_ADC_Start(hadc1); //启动ADC单次转换HAL_ADC_PollForConversion(hadc1, 50); //等待ADC转换完成smoke_value HAL_ADC_GetValue(hadc1); //读取ADC转换数据printf(smoke_value %f\r\n, 3.3/4096 * smoke_value);//电压值//printf(smoke_value %d \r\n, smoke_value);//多少个刻度HAL_Delay(500);
}3. llC介绍及OLED写数据函数封装352.56
笔记参照上官一号笔记第5章节视频参照上官一号92~103节
函数封装
用到的库函数
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size,uint32_t Timeout)参数一I2C_HandleTypeDef *hi2cI2C设备句柄 参数二uint16_t DevAddress目标器件的地址七位地址必须左对齐 参数三uint16_t MemAddress目标器件的目标寄存器地址 参数四uint16_t MemAddSize目标器件内部寄存器地址数据长度 参数五uint8_t *pData待写的数据首地址 参数六uint16_t Size待写的数据长度 参数七uint32_t Timeout超时时间 返回值HAL_StatusTypeDefHAL状态OKbusyERRORTIMEOUT
向OLED写命令的封装
void Oled_Write_Cmd(uint8_t dataCmd)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT,dataCmd, 1, 0xff);
}向OLED写数据的封装
void Oled_Write_Data(uint8_t dataData)
{HAL_I2C_Mem_Write(hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT,dataData, 1, 0xff);
}STM32CubeMx工程配置
4. 重做上官一号的IIC实验353.57
接线 SCL – PB6SDA – PB7 代码22.oled_test/MDK-ARM重新封装了Oled_Write_Cmd、Oled_Write_Data其他和51代码一样
5. SPI及W25Q128介绍354.58
SPI 是什么
SP I是串行外设接口Serial Peripheral Interface的缩写是一种高速的全双工同步的通信总线并且 在芯片的管脚上只占用四根线节约了芯片的管脚同时为 PCB 的布局上节省空间提供方便正是出于这 种简单易用的特性越来越多的芯片集成了这种通信协议比如 AT91RM9200 。
SPI 物理架构 SPI 包含 4 条总线SPI 总线包含 4 条总线分别为 SS、SCK、MOSI、MISO。它们的作用介绍如下 (1) MISO – Master Input Slave Output主设备数据输入从设备数据输出 (2) MOSI – Master Output Slave Input主设备数据输出从设备数据输入 (3) SCK – Serial Clock时钟信号由主设备产生 (4) CS – Chip Select片选信号由主设备控制
SPI 工作原理 SPI 工作模式
时钟极性CPOL 没有数据传输时时钟线的空闲状态电平0SCK在空闲状态保持低电平1SCK在空闲状态保持高电平 时钟相位CPHA 时钟线在第几个时钟边沿采样数据0SCK的第一奇数边沿进行数据位采样数据在第一个时钟边沿被锁存1SCK的第二偶数边沿进行数据位采样数据在第二个时钟边沿被锁存 模式 0 和模式 3 最常用。模式 0 时序图 模式 3 时序图
什么是 W25Q128
W25Q128 是华邦公司推出的一款 SPI 接口的 NOR Flash 芯片其存储空间为 128 Mbit相当于 16M 字 节。Flash 是常用的用于储存数据的半导体器件它具有容量大可重复擦写、按“扇区/块”擦除、掉电后数据可 继续保存的特性。Flash 是有一个物理特性只能写 0 不能写 1 写 1 靠擦除。
W25Q128 存储架构 一般按扇区4k进行擦除。可以按 章 – 节 – 页 – 字 进行理解。
W25Q128 常用指令
W25Q128 全部指令非常多但常用的如下几个指令 写使能 (06H) 执行页写扇区擦除块擦除片擦除写状态寄存器等指令前需要写使能。拉低 CS 片选 → 发送 06H → 拉高 CS 片选 读状态寄存器05H 拉低CS片选 → 发送05H→ 返回SR1的值 → 拉高CS片选 读时序03H 拉低CS片选 → 发送03H→ 发送24位地址 → 读取数据1~n → 拉高CS片选 页写时序 (02H) 页写命令最多可以向FLASH传输256个字节的数据。拉低CS片选 → 发送02H→ 发送24位地址 → 发送数据1~n → 拉高CS片选 扇区擦除时序20H 写入数据前检查内存空间是否全部都是 0XFF 不满足需擦除。拉低CS片选 → 发送20H→ 发送24位地址 → 拉高CS片选
W25Q128 状态寄存器
W25Q128 一共有 3 个状态寄存器它们的作用是跟踪芯片的状态。其中状态寄存器 1 较为常用。 BUSY指示当前的状态0 表示空闲1 表示忙碌WEL写使能锁定为 1 时可以操作页/扇区/块。为 0 时写禁止。
W25Q128 常见操作流程
以下流程省略了拉低/拉高片选信号CS。读操作 擦除扇区 写操作
5. 使用SPI通讯读写W25Q128模块355.59
硬件接线
VCC – 3.3VCS – PA4CLK – PA5DO – PA6DI – PA7
cubeMX配置 w25q128_write_nocheck流程图 代码27.spi_test/MDK-ARM
6. LCD1602介绍及实战356.60
项目需求
使用温湿度传感器模块DHT11获取温度及湿度并将值显示在LCD1602上同时通过蓝牙模块透传到手 机。
项目框图 硬件清单
DHT11LCD1602HC-08继电器杜邦线
LCD1602硬件接线
D0 ~ D7 – A0 ~ A7RS – B1RW – B2EN – B10V0 – GND正视看不到显示结果需要侧着看。否则需要接可调电阻VSS – GNDVDD – 5V工作电源BLA – 5V背光灯电源BLK – GND
cubemx配置 引脚封装
RS、RW、EN三根信号线经常需要进行拉高/拉低操作可以进行封装
#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_Pin GPIO_PIN_1
#define RW_Pin GPIO_PIN_2
#define EN_Pin GPIO_PIN_10
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET)如何将一个字节的数据按位一次性发送到GPIOA的8个管脚
GPIOA-ODR cmd;代码实现
代码24.lcd1602_test/MDK-ARM
#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_Pin GPIO_PIN_1
#define RW_Pin GPIO_PIN_2
#define EN_Pin GPIO_PIN_10
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_Pin, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET)
void Write_Cmd_Func(uint8_t cmd)
{RS_LOW;RW_LOW;EN_LOW;GPIOA-ODR cmd;HAL_Delay(5);EN_HIGH;HAL_Delay(5);EN_LOW;
}
void Write_Data_Func(uint8_t dataShow)
{RS_HIGH;RW_LOW;EN_LOW;GPIOA-ODR dataShow;HAL_Delay(5);EN_HIGH;HAL_Delay(5);EN_LOW;
}
void LCD1602_INIT(void)
{
//1延时 15msHAL_Delay(15);
//2写指令 38H(不检测忙信号)Write_Cmd_Func(0x38);
//3延时 5msHAL_Delay(5);
//4以后每次写指令读/写数据操作均需要检测忙信号
//5写指令 38H显示模式设置Write_Cmd_Func(0x38);
//6写指令 08H显示关闭Write_Cmd_Func(0x08);
//7写指令 01H显示清屏Write_Cmd_Func(0x01);
//8写指令 06H显示光标移动设置Write_Cmd_Func(0x06);
//9写指令 0CH显示开及光标设置}Write_Cmd_Func(0x0c);
}
void LCD1602_showLine(char row, char col, char *string)
{switch(row){case 1:Write_Cmd_Func(0x80col);while(*string){Write_Data_Func(*string);string;}break;case 2:Write_Cmd_Func(0x800x40col);while(*string){Write_Data_Func(*string);string;}break;}
}
//main函数里//char position 0x80 0x05;//char dataShow C;LCD1602_INIT();//Write_Cmd_Func(position);//选择要显示的地址//Write_Data_Func(dataShow);//发送要显示的字符LCD1602_showLine(1,6,NO.2);LCD1602_showLine(2,0,Jessie handsome);7. DHT11介绍及实战357.61
硬件接线
VCC – 5VGND – GNDDAT – PB7注意PB7既作为输入也作为输出则不能直接在CubeMX里配置需要自己写代码
cubemx配置 代码实现
#define DHT_HIGHT HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)
uint8_t datas[5];
void delay_us(uint16_t cnt)
{uint8_t i;while(cnt){for (i 0; i 10; i){}cnt--;}
}
void DHT_GPIO_Init(uint32_t Mode)
{ GPIO_InitTypeDef GPIO_InitStruct {0};__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin GPIO_PIN_7;GPIO_InitStruct.Mode Mode;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, GPIO_InitStruct);
}
void DHT11_Start(void)
{DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);DHT_HIGHT;DHT_LOW;HAL_Delay(30);DHT_HIGHT;DHT_GPIO_Init(GPIO_MODE_INPUT);while(DHT_VALUE);while(!DHT_VALUE);while(DHT_VALUE);
}
void Read_Data_From_DHT()
{int i;//轮int j;//每一轮读多少次char tmp;char flag;DHT11_Start();DHT_GPIO_Init(GPIO_MODE_INPUT);for(i 0;i 5;i){for(j0;j8;j){while(!DHT_VALUE);//等待卡g点delay_us(40);if(DHT_VALUE 1){flag 1;while(DHT_VALUE);}else{flag 0;}tmp tmp 1;tmp | flag;}datas[i] tmp;}
}
int fputc(int ch, FILE *f)
{ unsigned char temp[1]{ch};HAL_UART_Transmit(huart1,temp,1,0xffff); return ch;
}
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();
printf(Jessie handsome\r\n);
HAL_Delay(2000);while (1){Read_Data_From_DHT();printf(Humi: %d.%d%% , datas[0], datas[1]);printf(Temp: %d.%d\r\n , datas[2], datas[3]);HAL_Delay(2000);}
}8. 整合DHT11及LCD1602358.62
项目设计
继电器数据线插在PB6上DHT11及LCD1602接线与上述相同。
项目实现
注意点
将Use MicroLIB的勾打上在main函数把串口中断打开使用蓝牙模块时将波特率设置为9600
9. 温湿度LCD显示并占传服务器项目完结359.63 char message[16];
while (1)
{Read_Data_From_DHT();if(datas[2] 24)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);memset(message, 0, sizeof(message));sprintf(message, Humi: %d.%d%%, datas[0], datas[1]);LCD1602_showLine(1,0, message);sprintf(message, Temp: %d.%d, datas[2], datas[3]);LCD1602_showLine(2,0, message);HAL_Delay(2000);
}