Merge pull request ‘1’ (#5) from xy_1 into master
PA0用于测出待测电阻端电压 PA2是74HC4051的S0 PA3是74HC4051的S1 PA4是74HC4051的S2 PA5是74HC4051的EN PB0是键盘行0 PB1是键盘行1 PB10是键盘行2 PB11是键盘行3 PB12是键盘列0 PB13是键盘列1 PB14是键盘列2 PB15是键盘列3 PB8 是I2C_SCL,用来控制显示屏 PB9 是I2C_SDA,用来控制显示屏 PB4 是Tim3端 PA1 是充放电端
测电阻电压使用比例法 新增引脚配置PA7,用来获取已知未知电阻的电压 PA0 用来读整个的电压
测电容采用RC时间常数法,使用: 一个 GPIO 先给电容放电 清零 TIM3->CNT 打开充电开关 启动输入捕获 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); 阈值到达时,TIM3_CH1 捕获 在回调里读 HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1) 按公式算电容 充电路径一直存在 只需要测前放电一下,然后松开放电就开始充电
开始 ↓ 设置 PA8 激励输出有效 ↓ 根据当前模式选择量程 自动档:先使用 current_range 手动档:直接使用 manual_range ↓ 通过 74HC4051 切换到对应参考电阻通道 ↓ 等待通道稳定 ↓ ADC1 读取总电压 Vtotal ADC2 读取分支电压 Vbranch ↓ 判断采样是否成功 ├─ 否 → 结果置 0,结束 └─ 是 ↓ 按分压公式计算 Rx ↓ 若为自动档,判断是否需要切换量程 ├─ 需要 → 切换通道后重新采样并重新计算 └─ 不需要 ↓ 判断结果是否越界或无效 ├─ 是 → 按 0 或超量程处理 └─ 否 ↓ 若刚切档:重置滤波器 否则:进入滑动平均滤波 ↓ 保存 last_resistance / last_voltage ↓ 结束
开始 ↓ 根据当前模式选择量程 自动档:使用 current_range 手动档:使用 manual_range ↓ 关闭激励输出 ↓ 通过 74HC4051 选择对应充电电阻 ↓ PA1 拉低,对待测电容放电 ↓ 等待放电时间达到 discharge_duration_us ↓ 释放 PA1 ↓ 打开激励输出,电容开始通过已知电阻充电 ↓ 启动 TIM3 输入捕获,等待上升沿阈值到达 ↓ 是否捕获到上升沿? ├─ 否 │ ↓ │ 是否超时? │ ├─ 否 → 继续等待 │ └─ 是 │ ↓ │ 自动档且当前是 50nF 档? │ ├─ 是 → 切到 500nF 档,重新开始 │ └─ 否 → 按超量程处理,结束 └─ 是 ↓ 记录上升沿计数值 captured_rise_ticks ↓ 若计数过小,认为无效,重新开始 ↓ 关闭激励输出 ↓ 启动 TIM3 输入捕获,等待下降沿 ↓ 是否捕获到下降沿? ├─ 否且超时 → 重新开始 └─ 是 ↓ 判断下降沿计数是否有效 ├─ 否 → 重新开始 └─ 是 ↓ 用上升沿时间按 RC 公式计算电容值 ↓ 乘以标定系数 ↓ 自动档判断是否需要重新切换量程 ├─ 需要 → 切档后重新开始 └─ 不需要 ↓ 保存 last_capacitance ↓ 结束
Resistance_StartMeasurement()
calculate_resistance()
Capacitance_Task()
ticks_to_capacitance_nF()
电赛代码上传
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
3ElectronicDesign
PA0用于测出待测电阻端电压 PA2是74HC4051的S0 PA3是74HC4051的S1 PA4是74HC4051的S2 PA5是74HC4051的EN PB0是键盘行0 PB1是键盘行1 PB10是键盘行2 PB11是键盘行3 PB12是键盘列0 PB13是键盘列1 PB14是键盘列2 PB15是键盘列3 PB8 是I2C_SCL,用来控制显示屏 PB9 是I2C_SDA,用来控制显示屏 PB4 是Tim3端 PA1 是充放电端
测电阻电压使用比例法 新增引脚配置PA7,用来获取已知未知电阻的电压 PA0 用来读整个的电压
测电容采用RC时间常数法,使用: 一个 GPIO 先给电容放电 清零 TIM3->CNT 打开充电开关 启动输入捕获 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); 阈值到达时,TIM3_CH1 捕获 在回调里读 HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1) 按公式算电容 充电路径一直存在 只需要测前放电一下,然后松开放电就开始充电
文字版测量流程图
电阻测量流程图
电容测量流程图
对照关系
Resistance_StartMeasurement()calculate_resistance()Capacitance_Task()ticks_to_capacitance_nF()