光学单位

本文介绍了光学的基本单位,包括光强度(坎德拉)、光通量(流明)、光照度(勒克斯)和光亮度(尼特),以及反射系数的概念。通过公式L=R×E解释了亮度与反射系数和照度的关系,并讨论了不同单位之间的转换和实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




物理量 符号 国际单位制 单位符号 注释
光能(Luminous energy) Qv 流明  lm·s 单位有时被称作"talbots"。
光通量(Luminous flux) Φv 流明lmcd·
这是接收端#include "main.h" #include "adc.h" #include "usart.h" #include "rtc.h" #include "tim.h" #include "gpio.h" //#include "MY_adc.h" #include "math.h" #include "stdio.h" #define LED1_ON() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET) #define LED1_OFF() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET) /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "step.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ float ADC_Value = 0,ADC_Volt = 0,R = 0; uint16_t Lux = 0; uint8_t str_buff[64]; uint16_t ADC0_Get_Value() { HAL_ADC_Start(&hadc1); LED1_ON(); if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK) { ADC_Value = HAL_ADC_GetValue(&hadc1); ADC_Volt = ADC_Value /4096 * 3.3f; R = ADC_Volt / (3.3f - ADC_Volt) * 10000; Lux = 40000 * pow(R, -0.6021); if (Lux > 999) { Lux = 999; } return Lux; } } /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ uint8_t lvgl[2] = {0,0}; uint16_t LED_PWM; /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart3) { LED_PWM = (int)lvgl[1]*110; __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,LED_PWM); HAL_UART_Receive_IT(&huart3, lvgl, 2); // } } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ 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_LPUART1_UART_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM15_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ Stepper_Init(); Stepper_Rotate(Forward, 2, 1); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); HAL_UART_Receive_IT(&huart3, lvgl, 2); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 这是发送端#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./USMART/usmart.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/TOUCH/touch.h" #include "./MALLOC/malloc.h" #include "./BSP/TIMER/btim.h" #include "lvgl.h" #include "lv_port_indev_template.h" #include "lv_port_disp_template.h" #include "stdlib.h" #include "time.h" #include "stm32f1xx_hal.h" #include <stdio.h> static int32_t slider_value = 0; //滑块数值--升降台高度 static int32_t arc_value = 0; //圆弧数值--LED亮度 static int32_t c=0; static int32_t b=0; unsigned int gaodu; //高度变量 uint8_t send[2] = {0,0}; //串口发送 static lv_obj_t *label; static lv_obj_t *label1; static lv_obj_t *label_s; static lv_obj_t *label_t; static lv_obj_t *label_t_1; //升降 static lv_obj_t *btn_s; static lv_obj_t *btn; static lv_obj_t *btn1; static lv_obj_t *btn2; static lv_obj_t *msgbox; static lv_obj_t *msgbox1; static lv_obj_t *msgbox2; static lv_obj_t *msgbox3; static lv_obj_t *title; static lv_obj_t *title1; static lv_obj_t *title2; static lv_obj_t *title3; static const char *btn5[]={"Counite",""}; static const char *btn6[]={"Counite",""}; static const char *btn7[]={"Counite",""}; static const char *btn8[]={"Counite",""}; LV_IMG_DECLARE (gaohaoguang); LV_IMG_DECLARE (weixia); LV_IMG_DECLARE (shengjiangtai); LV_IMG_DECLARE (daideng); //static lv_obj_t *led; //static lv_obj_t *switch2; //static lv_obj_t *spinner; //static lv_obj_t *list; //static lv_obj_t *checkbox; //static lv_obj_t *dd; //static lv_obj_t *roller; //static lv_obj_t *bar; //static lv_obj_t *spinbox; //static lv_point_t line_points[]={{150,50},{250,200},{50,200},{150,50}}; //static const char *map[]={"#ff0000 btn1#","\n","btn2","btn3",""}; //static const char *btns[]={"continue","close",""}; UART_HandleTypeDef huart1; void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart1) { send[0] = slider_value; send[1] = arc_value; HAL_UART_Transmit_IT(&huart1,send,2); } } int i,n,m,p; uint16_t Num; static void my_event_cb(lv_event_t * e) //回调函数 { lv_obj_t *a=lv_event_get_target(e); if(a==btn) { n=1; } if(a==btn1) {n=0; p=3;} if(p==3){ if(c==1){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox, LV_OBJ_FLAG_HIDDEN); if(c==2){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox1, LV_OBJ_FLAG_HIDDEN); if(c==3){p=0;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} // lv_obj_clear_flag(msgbox2, LV_OBJ_FLAG_HIDDEN); if(c==4){p=0;lv_label_set_text_fmt (label_s,"No");}} // lv_obj_clear_flag(msgbox3, LV_OBJ_FLAG_HIDDEN); } //滑块事件回调------------------------------------------------------------------------------------------- static void slider_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); if (code != LV_EVENT_VALUE_CHANGED) return; lv_obj_t *slider = lv_event_get_target(e); slider_value = lv_slider_get_value(slider); // 更新全局变量 lv_label_set_text_fmt(label_t, "high: %d", slider_value); } //圆弧事件回调------------------------------------------------------------------------------------------- static void arc_event_cb(lv_event_t *e) { lv_obj_t *target = lv_event_get_target(e); arc_value = lv_arc_get_value(target); } int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(72); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ tp_dev.init(); /* 触摸屏初始化 */ btim_timx_int_init(10-1,7200-1); /* 初始化定时器 */ lv_init(); /* lvgl系统初始化 */ lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */ lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */ //串口------------------------------------------------------------------------------------------ HAL_UART_Transmit_IT(&huart1,send,2); //背景板------------------------------------------------------------------------------------------ // label_t = lv_label_create(lv_scr_act ()); //图片-------------------------------------------------------------------------------------------- lv_obj_t *img = lv_img_create(lv_scr_act()); lv_img_set_src (img,&gaohaoguang); lv_obj_set_pos (img,15,195); lv_obj_t *img1 = lv_img_create(lv_scr_act()); lv_img_set_src (img1,&weixia); lv_obj_set_pos (img1,315,171); lv_obj_t *img2 = lv_img_create(lv_scr_act()); lv_img_set_src (img2,&shengjiangtai); lv_obj_set_pos (img2,26,60); lv_obj_t *img3 = lv_img_create(lv_scr_act()); lv_img_set_src (img3,&daideng); lv_obj_set_pos (img3,197,160); //滑块-------------------------------------------------------------------------------------------- lv_obj_t *slider = lv_slider_create(lv_scr_act()); lv_obj_set_pos(slider,25,-85); lv_obj_set_size(slider,330,30); lv_slider_set_value(slider,0,LV_ANIM_OFF); lv_slider_set_range(slider,0,100); lv_obj_add_event_cb(slider,slider_event_cb,LV_EVENT_VALUE_CHANGED,NULL); // 设置轨道背景色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x808080), LV_PART_MAIN); // 设置指示器颜色 lv_obj_set_style_bg_color(slider, lv_color_hex(0x0000FF), LV_PART_INDICATOR); // 设置旋钮颜色和尺寸 lv_obj_set_style_bg_color(slider, lv_color_hex(0x00ffff), LV_PART_KNOB); lv_obj_set_style_pad_all(slider, 8, LV_PART_KNOB); // 旋钮大小 lv_obj_set_align(slider,LV_ALIGN_CENTER); // 数值显示 label_t = lv_label_create(lv_scr_act()); lv_obj_set_align(label_t, LV_ALIGN_TOP_RIGHT); char text_buffer[20]; // 定义足够大的字符数组存储转换后的字符串 sprintf(text_buffer, "%d", slider_value); // 将整数转换为字符串 lv_label_set_text(label_t, text_buffer); // 传递字符串指针 lv_obj_set_style_text_font(label_t, &lv_font_montserrat_48, 0); // lv_obj_set_style_text_color(label_t_1, lv_color_hex(0x0fff0f), 0); //圆弧-------------------------------------------------------------------------------------------- lv_obj_t *arc = lv_arc_create(lv_scr_act()); /* 设置圆弧尺寸 */ lv_obj_set_size(arc, 174, 174); // 宽度和高度均为 200px /* 调整圆弧线条粗细 */ lv_obj_set_style_arc_width(arc, 20, LV_PART_MAIN); // 背景线条粗细 lv_obj_set_style_arc_width(arc, 20, LV_PART_INDICATOR); // 前景线条粗细 /* 设置位置和范围 */ lv_obj_set_pos(arc, 151, 110); // 调整位置(根据新尺寸可能需要重新定位) lv_arc_set_range(arc, 0, 100); // 值范围 0~100 /* 绑定事件 */ lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL); // ///////////////////////////////////////////////////////////////////////////////////////////////////////// //拓展内容 1. 实体按键输入 while(1) { srand(Num); // send[0] = slider_value; // send[1] = arc_value; // HAL_UART_Transmit_IT(&huart1, send, 2); HAL_Delay(10); // 示例:10ms发送一次 // if(n==1){i=rand()%50+1;} // lv_label_set_text_fmt (label_t," %d ",i); tp_dev.scan(0); /* 触摸扫描 */ lv_task_handler(); Num+=7; if(i>=1&&i<=3){m=1;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=4&&i<10||i>35&&i<40){m=2;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=15&&i<=20||i>45&&i<=50){m=3;c=m;lv_label_set_text_fmt (label_s,"Prize: %d ",c);} if(i>=10&&i<15||i>=40&&i<=45||i>=26&&i<=35||i>20&&i<=25){m=4;c=m;lv_label_set_text_fmt (label_s,"No");} } }分析一下为什么我滑动圆环,LED的亮度没有随之变化
最新发布
06-02
<think>好的,我现在需要帮助用户分析STM32使用LVGL圆弧控件改变LED亮度时,滑动圆环但LED亮度未变化的原因。首先,我得理清可能的问题点。用户的问题涉及到硬件和软件的结合,可能原因较多,需要逐一排查。首先,硬件连接是否正确?LED的PWM引脚是否与STM32的对应引脚连接正确,有没有接触不良或者接线错误的情况。比如,PWM输出引脚可能配置错误,导致信号无法正确传输到LED。另外,PWM模块是否已经正确初始化,比如定时器的配置、通道设置等,这些都是基础,如果这里出错,整个PWM输出都不会工作。接下来考虑LVGL圆弧控件的回调函数。用户是否正确地绑定了事件回调函数?比如,圆弧的值改变事件是否被正确监听,回调函数有没有被触发。如果回调函数没有被调用,那么即使滑动圆环,代码也不会执行相应的亮度调整。这时候需要检查事件注册的代码,确保事件类型和回调函数正确关联。然后,PWM占空比的映射是否正确。圆弧控件的值范围可能和PWM的占空比范围不一致,比如圆弧的值是0-100,而PWM的占空比是0-255,这时候需要进行适当的映射转换。如果没有正确转换,占空比可能一直处于极低或无效值,导致LED亮度没有变化。此外,占空比设置函数是否正确调用,比如是否使用了正确的定时器句柄和通道。 还有可能是PWM信号未正确输出到LED。即使软件部分配置正确,硬件上可能存在问题,比如LED的限流电阻不合适,或者PWM频率设置过高,超出LED的响应范围。这时需要用示波器或逻辑分析仪检查PWM信号是否正常输出,以及信号的电平和频率是否符合LED的要求。另外,LVGL的显示刷新问题也可能导致控件看似滑动但实际值未更新。需要确认圆弧控件的事件是否被正确触发,并且值的变化能够实时传递到回调函数中。此外,是否有其他任务或中断影响了PWM的输出,比如优先级较低的任务被延迟执行,导致占空比更新不及时。 最后,代码中的逻辑错误,比如变量作用域问题、未正确保存PWM句柄、或者在回调函数中错误地引用了其他外设等,都可能导致功能失效。需要仔细检查代码,特别是回调函数中的每一步操作,确保没有遗漏或错误。 总结下来,可能的排查步骤包括检查硬件连接、验证PWM初始化、确认回调函数绑定和事件处理、检查数值映射和占空比设置、测试PWM信号输出,以及排除其他软件逻辑错误。用户可能需要逐一排除这些可能性,或者提供部分代码以便更针对性地分析。</think>### 圆环控件与LED亮度变化关联问题分析 #### 一、硬件层面排查 1. **PWM输出验证** - 检查LED对应的PWM引脚是否与STM32硬件连接正确 - 使用示波器测量PWM波形是否正常输出,验证频率和占空比是否符合预期$$f_{PWM} = \frac{TIM_{clock}}{(ARR+1)(PSC+1)}$$[^2] 2. **LED驱动电路** - 确认限流电阻阻值是否适配当前LED工作电压 - 检查MOS管/三极管驱动电路是否正常工作 #### 二、LVGL控件配置 1. **圆弧控件范围设置** ```c lv_arc_set_range(arc, 0, 100); // 确保值域映射到0-100% ``` - 未设置值域时默认范围为(0-360),可能导致亮度映射比例错误 2. **事件回调绑定** ```c lv_obj_add_event_cb(arc, arc_event_handler, LV_EVENT_VALUE_CHANGED, NULL); ``` - 缺少`LV_EVENT_VALUE_CHANGED`事件注册会导致滑动事件未被捕获 #### 三、软件逻辑关键点 1. **PWM占空比映射** ```c // 错误示例:未进行值域转换 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, arc_value); // 正确做法:映射0-100到0-ARR uint16_t duty = (arc_value * htim3.Instance->ARR) / 100; __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty); ``` 2. **定时器配置检查** - 验证定时器时钟使能状态 - 确认计数模式为`TIM_COUNTERMODE_UP` - 检查预分频器(PSC)和自动重载值(ARR)是否合理 #### 四、典型故障场景 1. **DMA冲突** - 当PWM通道启用DMA传输时,直接修改CCR寄存器可能无效 - 解决方案:改用`HAL_TIM_PWM_Start_DMA()`或禁用DMA 2. **浮点运算问题** ```c // 错误示例:整数除法精度丢失 duty = arc_value * 255 / 100; // 当arc_value=50时结果为127非127.5 // 正确做法:使用四舍五入 duty = (arc_value * 255 + 50) / 100; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值