多模式调光台灯

1.使用电位器调节光亮

CubeMX的配置:

这里使用timer3定时触发ADC模数转换器,ADC采集一次数据并触发一次中断,执行相应的程序。

挂在APB1的84MHZ时钟下。

TIM3怎么样触发ADC1?

针对你的配置(TIM3触发ADC1),关键在于配置TIM3的TRGO(触发输出)信号。既然你ADC那边已经选好了"Timer 3 Trigger Out event",接下来只需要把TIM3内部这个信号"生产"出来就行。

在STM32标准库(HAL库)中,具体操作分两步:

  1. 配置TIM3产生TRGO信号

你需要决定以什么节奏触发ADC,最常用的是更新事件(Update Event),也就是定时器溢出时触发。

· 向上计数模式:CNT计到ARR(自动重装载值)时产生更新,同时输出TRGO。

启动TIM3

配置好之后,调用 HAL_TIM_Base_Start(&htim3); 定时器就会开始跑,每到设定时间就自动"踢"ADC一脚。

挂在APB1的84MHZ时钟下。

代码:

cs 复制代码
main.c


/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "dimmable.h"
/* USER CODE END Includes */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint16_t brightness=0;
/* USER CODE END PM */

 /* USER CODE BEGIN 2 */
  dimmable_Init();
  /* USER CODE END 2 */
cs 复制代码
dimmable.h

#ifndef __DIMMABLE_H
#define __DIMMABLE_H

#include "stm32f4xx_hal.h"
#include "tim.h"
#include "main.h"
#include "adc.h"

#define VR_JEST_THRESHOLD 30    //自己定

void dimmable_Init(void);
int8_t dimmable_set_brightness(uint16_t brightness);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc);

#endif
cs 复制代码
dimmable.c

#include "dimmable.h"
#include <math.h>
#include "stdio.h"
#include "stdlib.h"


/*初始化,开启PWM,开启ADC与中断*/
void dimmable_Init(void)
{
	HAL_TIM_PWM_Start(&htim13,TIM_CHANNEL_1);    //开启PWM
	HAL_ADC_Start_IT(&hadc1);    //开启ADC与中断
    HAL_TIM_Base_Start(&htim3 );  //开启tim3
}

//回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	static int32_t adc_value_last=-1;
	int32_t adc_value=0;
  if(hadc->Instance ==ADC1)     //判断模数转换器,当多个ADC同时配置时用,这里可以省略。
	{
		adc_value=HAL_ADC_GetValue (hadc );
		if(labs(adc_value-adc_value_last)>VR_JEST_THRESHOLD)     //求绝对值,防止噪声和误触。可以用平均滤波算法。
		{
			//用double是使(adc_value *1000/4096)执行浮点数精度进行运算,+0.5是进行四舍五入(因为外面进行无符号整数强制类型转换)
            //线性映射公式
			uint16_t brightness=(uint16_t )((double )(adc_value *1000/4096)+0.5);
			dimmable_set_brightness( brightness);
			adc_value_last =adc_value ;   //
		}
	}		
}

//设置PWM的值
int8_t dimmable_set_brightness(uint16_t brightness)
{
	//如果brightness的值大于DIMMABLE_MAX_BRIGHTNESS的话就返回失败
	if(brightness >DIMMABLE_MAX_BRIGHTNESS )
	{
		return -1;  //失败
	}
	
	/*pow是计算平方的,
伽马补偿,公式如下:实际占空比=(感知亮度)的次方乘最大占空比*/
	brightness =(uint16_t )(pow((double)brightness /DIMMABLE_MAX_BRIGHTNESS ,2.2)*DIMMABLE_MAX_BRIGHTNESS );
	
	printf ("%d  ",brightness );
	brightness =1000-brightness ;
	
	__HAL_TIM_SET_COMPARE(&htim13 ,TIM_CHANNEL_1 ,brightness );   //设置PWM的值,占空比=高电平/周期

	return 0;    //成功
}
相关推荐
HQB202621 分钟前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)2 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~2 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计3 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界4 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB20264 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥6 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理6 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC7 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件
金色光环7 小时前
【DSP学习】C2000_PWM中断程序_笔记
笔记·单片机·学习