使用ADC采样光敏电阻数值,如何根据这个数值调节LED灯亮度。
//打开定时器3的通道3,并且设置为PWM功能
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */\
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_ADC_Start(&hadc);//开启ADC采样
//获取ADC值
adc_val = HAL_ADC_GetValue(&hadc);
vlot = adc_val / 4095.0 * 999;
printf("adc_val:%d\r\n",adc_val);
int val = vlot;
TIM3->CCR3 = 999-val;
HAL_Delay(50);
}
总结DMA+空闲中断接收数据的使用方法:
1.需在cubeMX上开启DMA接收
2.以DMA+空闲中断方式接收数据:
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size)
3.在回调函数对接收的数据进行处理
DMA的作用
直接存储器存储,减轻cpu的负担,提高系统的性能;
DMA加空闲中断接收数据:用于接收不定长数据,由于CPU不知道什么时候有数据会发来,可以开启DMA接收,让DMA一直监测,当有数据并且接收完一包数据就会产生空闲中断处理数据。
串口重定向:
由于调用printf会调用fputc然后再调用HAL_UART_Transmit来发送数据,所以我们可以只要重新实现fputc就可以重新实现使用printf向打印发送的数据
1、重写fputc
2、勾选MICRO LIB
3、打开串口接收中断
4、在串口接收中断回调函数取出数据
5、接收完数据需要重新打开串口接收中断
ADC采样:
分辨率:采样的精度,分辨率越高就代表了采样精度越高,得到的数据越准确。
12位的ADC:采样得到的数据的范围是在0~2^12-`(4095)
ADC采样时间:采样时间越长 ,采样的精度越高
PWM:
占空比 = 高电平占整个周期的时间 / 总电平时间
一个定时器有四个PWM输出通道
CNT:计数值
ARR:重装载值
CCRX:比较寄存器
关系:
当CNT的值到达ARR的时候就会溢出就会变成0,然后重新计数。
CNT从0开始计数。
当CNT = CCRX的值就表现高电平。
ARR的值已经确定了,通过调节CCRX可以调节高低电平的占比。
通过调节高电平占整个周期的时间来调节占空比。