工程所用到的开发板为硬石的YS_F1Pro型号,芯片是stm32f103zet6
思路:通过adc读取光敏传感器的阻值,利用pwm进行亮度调节
根据原理图,光敏传感器接PC1(板子上已用跳线帽连接),led1接PB0
首先使用CubeMX配置工程,重点讲adc与pwm部分。
将PC1引脚设置成ADC1_IN11,打开Continuous Conversion Mode,adc设置完成
PB0设置成TIM3_CH3, 通道3选择pwm模式,设置预分频系数为72,即pwm频率为72MHz(时钟周期)/72=1MHz,计数周期设置成500,计数值Pluse暂时设置为0,根据Pluse的大小可以改变led的亮度,pwm占空比为计数周期/Pluse,Pluse越大灯越亮,最大值为计数周期500
生成代码后再main函数里打开pwm,使用
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
打开adc并读取adc转换出来的值
HAL_ADC_Start(&hadc1);
adc_vol = HAL_ADC_GetValue(&hadc1);
将adc读出的值赋值给pwm,除5是因为最大计数周期为500,前面通过串口打印发现光敏电阻值在0~2500之间变化,故缩小成1/5
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, (adc_vol/5));
相关完整代码如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM3_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
printf("running\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Get_ADC_Sample();
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, (adc_vol/5));
HAL_Delay(500);
}
/* USER CODE END 3 */
}
uint16_t adc_vol=0;
void Get_ADC_Sample(void)
{
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
{
adc_vol = HAL_ADC_GetValue(&hadc1);
}
printf("%d\r\n", adc_vol);
HAL_ADC_Stop(&hadc1);
}
实验现象为:随着光照的加强,电阻值变小,led亮度减弱,反之则亮度增强