光照数据采集与处理
智能照明系统的工作流程始于环境光照数据采集。N32L4 系列 ADC 按照预设的采样周期(如 100ms)对光线传感器输出的模拟信号进行采样转换。采集到的原始 ADC 值通过以下公式转换为实际光照强度值:
光照强度(lux)=
4096
ADC值
×参考电压×转换系数
其中转换系数由光线传感器的灵敏度与前端放大电路的增益决定,需通过实际标定确定。例如,当参考电压为 3.3V,转换系数为 1000 时,若 ADC 值为 2048,则对应的光照强度为:
4096
2048
×3.3×1000=1650lux
为提高数据可靠性,系统通常采用滑动平均滤波算法对连续多次采样值进行处理:
c
/* 滑动平均滤波函数 */
uint16_t MovingAverageFilter(uint16_t *pData, uint8_t len, uint16_t newData)
{
static uint16_t sum = 0;
static uint8_t idx = 0;
/* 减去最早的采样值,加上新采样值 */
sum = sum - pData[idx] + newData;
pData[idx] = newData;
/* 更新索引 */
idx = (idx + 1) % len;
/* 返回平均值 */
return sum / len;
}
智能调光算法实现
N32L4 系列 MCU 根据处理后的光照数据,结合预设的光照阈值执行调光算法。典型的调光逻辑如下:
环境光照强度判断:将当前光照值与预设的目标光照阈值(如 500lux)进行比较
计算亮度补偿值:根据光照差值计算 LED 需要补充的亮度值
生成 PWM 控制信号:将亮度补偿值转换为对应的 PWM 占空比
平滑过渡控制:采用渐变方式调整 PWM 占空比,避免亮度突变
以下是调光控制核心代码示例:
c
/* 智能调光控制函数 */
void LightControl(void)
{
uint16_t adcValue, lightValue;
uint16_t pwmDuty;
static uint16_t lastPwmDuty = 0;
/* 读取ADC值 */
adcValue = Adc_GetSglResult();
/* 转换为光照强度(lux) */
lightValue = (adcValue * 3300) / 4096; // 假设转换系数为1
/* 计算目标PWM占空比 */
if(lightValue < TARGET_LIGHT) {
/* 环境光不足,计算需要增加的亮度 */
pwmDuty = 100 - ((lightValue * 100) / TARGET_LIGHT);
if(pwmDuty > 100) pwmDuty = 100;
} else {
/* 环境光充足,LED关闭 */
pwmDuty = 0;
}
/* 平滑过渡控制 */
if(pwmDuty > lastPwmDuty) {
lastPwmDuty += SMOOTH_STEP;
if(lastPwmDuty > pwmDuty) lastPwmDuty = pwmDuty;
} else if(pwmDuty < lastPwmDuty) {
lastPwmDuty -= SMOOTH_STEP;
if(lastPwmDuty < pwmDuty) lastPwmDuty = pwmDuty;
}
/* 设置PWM占空比 */
Pwm_SetDuty(PWM_CH0, lastPwmDuty);
}
低功耗运行机制
N32L4 系列 ADC 的低功耗特性在整个系统运行中发挥关键作用。在非采样期间,ADC 进入休眠状态,电流消耗低至微安级别。系统采用定时器唤醒机制,仅在需要采样时短暂激活 ADC,完成采样后立即进入低功耗模式。
同时,MCU 的其他外设如 PWM 控制器在 LED 稳定工作时也可降低工作频率,进一步减少功耗。通过这种动态功耗管理策略,智能照明系统的待机功耗可控制在 5mW 以下,大幅延长电池供电设备的使用时间,符合智能家居对节能环保的要求。
|