基于hal库与硬石stm32f1开发板实现光敏传感器控制led亮度

工程所用到的开发板为硬石的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亮度减弱,反之则亮度增强

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值