思维导图
作业:
1.使用ADC采样光敏电阻数值,如何根据这个数值调节LED灯亮度
- 连接硬件:将光敏电阻与单片机的ADC引脚连接,将LED灯与单片机的PWM引脚连接。
- 初始化:在程序中初始化ADC和PWM模块,并设置相应的引脚。
- 采样光敏电阻数值:使用ADC模块对光敏电阻进行采样,获取其数值。
- 转换为亮度值:根据采样到的光敏电阻数值,将其转换为对应的亮度值。可以通过一定的映射关系或者查找表来实现。
- 调节LED灯亮度:使用PWM模块控制LED灯的亮度,将转换得到的亮度值作为PWM占空比进行设置。
2.总结DMA+空闲中断接收数据的使用方法
-
配置ADC模块:首先需要配置ADC模块的参数,包括采样通道、采样精度、采样速率等。可以使用STM32CubeMX工具进行配置,或者手动编写代码进行配置。
-
配置DMA:使用DMA(直接内存访问)可以实现数据的高速传输,减少CPU的负载。配置DMA通道,将ADC的转换结果传输到指定的内存地址。
-
配置空闲中断:在DMA传输完成后,可以通过空闲中断来触发处理数据的操作。在空闲中断中可以读取DMA传输的数据,并进行相应的处理。
-
根据采样数值调节LED灯亮度:根据光敏电阻的采样数值,可以确定环境光的强度。根据需求,可以通过PWM(脉冲宽度调制)控制LED灯的亮度。根据采样数值的大小,调整PWM的占空比,从而改变LED灯的亮度。
总结:
1.DMA的作用(DMA+空闲中断接收数据)
DMA(Direct Memory Access,直接内存访问)
用于实现外部设备和系统内存之间的高效数据传输,从而减轻CPU的负担
空闲中断接收数据
处理长度不确定的数据,不知道外部什么时候会发来数据,可以开启DMA接收,让DMA一直监测是否有数据,当有数据并且接收完一包数据就产生空闲中断处理数据规定的时间一般指的是发送一个字节数据的时间。
串口接收完成中断回调函数是接收到指定数据后被调用(适用于数据量小长度长度确定的情况下)
空闲中断回调函数是一段时间内没有数据接收的时候被调用(适用于数据量大并且数据不确定长度的情况下)
函数
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
2.串口重定向(如何实现串口重定向)
进行重定向之前,需要配置好串口,使用到串口的轮寻模式
加标准输入输出头文件:stdio.h
重写fputc()函数
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;}
重写fgetc()函数
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}
3.串口的数据接收
串口是通过数据帧的发送,波特率就是代表每秒可以传输的数据位数(bit/s),波特率越大串口传输的速率越快。串口的数据帧格式:规定串口是如何发送和接收数据的。
1.起始位:代表开始发送一帧数据(1bit)
2.数据位:代表有效的数据(8bit == 1字节)
3.校验位:要来检测数据的正确性(1bit)(可有可无)
4.停止位:表现已经发送完成一次数据可以进行下一次数据的发送(1bit)
4.ADC采样(分辨率,采样时间)
ADC是一种将模拟信号转换为数字信号的一种器件或者是电路
分辨率:采样的精度,分辨率越高就代表了采样精度越高,得到的数值越准确。
12位的ADC:采样得到的数据的范围是在0~2^12-1(4095)
函数:
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
采样时间:239.5cycles(最大)
5.PWM(占空比,ARR,CNT和CCRX的关系)(如何去调整占空比)
PWM是脉宽调制(Pulse Width Modulation)常用于控制电机速度、LED亮度调节、音频信号合成
占空比 = 高电平占整个周期的时间 / 总电平时间
(一个定时器有四个PWM输出通道:每一个通道都可以对应一个引脚,通过定时器输出PWM波形可以达到调节电压的效果。)
CNT:计数值 ARR:重装载值 CCRX:比较寄存器
1.当CNT的值到达ARR的时候就会溢出就会变成0,然后重新计数。 CNT从0开始计数。
2.当CNT = CCRX的值就表现高电平。 ARR的值已经确定了,通过调节CCRX可以调节高低电平的占比。