#import "../template.typ": *

#show: project.with(
  title: "实验报告 3",
  authors: (
    "absolutex",
  )
)

= 电容触摸按键实验

== 实验目的

通过STM32F429的TIM2的通道1（PA5）实现输入捕获功能，并实现一个简单的电容触摸按键，通过该按键控制灯DS1的亮灭。了解触摸按键的原理，并能针对此动作进行简单的反馈。

== 实验原理

使用检测电容充放电时间的方法来判断是否有触摸，图1中R是外接的电容充电电阻，Cs是没有触摸按下时TPAD与PCB之间的杂散电容。而Cx则是有手指按下的时候，手指与TPAD之间形成的电容。图中的开关是电容放电开关（由实际使用时，由STM32F429的IO代替）。先用开关将Cs（或C+Cx）上的电放尽，然后断开开关，让R给Cs（或Cs+Cx）充电，当没有手指触摸的时候，Cs的充电曲线如图中的A曲线。而当有手指触摸的时候，手指和TPAD之间引入了新的电容Cx，此时Cs+Cx的充电曲线如图中的B曲线。从上图可以看出，A、B两种情况下，Vc达到Vth的时间分别为Tcs和Tcs+Tcx。在本次实验中，只要能够区分Tcs和Tcs+Tcx，就已经可以实现触摸检测了，当充电时间在Tcs附近，就可以认为没有触摸，而当充电时间大于Tcs+Tx时，就认为有触摸按下（Tx为检测阀值）。

#figure(
  image("1.png", width: 70%),
  caption: [电容触摸按键原理],
)

== 代码描述

#include_code_file("../代码/5.c","main.c 片段", "c")

== 实验结果

在本次实验中，修改了部分代码，实现了开始时红黄两灯以较慢的速度交替发光，通过不断触摸覆铜区域，增加交替变化的频率，最终达到以不同亮度闪烁的状态，总体上实现了触摸按键增加频闪频率的功能。

== 心得体会

开始时我封装了一个以不同频率闪烁的函数，然而实际测试中发现很难接受到按键信号，因为将 `delay_ms` 放在该函数内，函数运行会阻塞主线程（外层的 `while` 循环），使传感器无法检测到按键信号。

在前期测试中有出现两灯常亮的情况，但其实是频率过快人眼不能辨别，因此需要调整参数。`temp[] = {1000, 500, 100, 50}` 和 `t > temp[stage] / delay / 4` 的具体数字是调整的结果。



= 光照&接近传感器实验外部中断实验
== 实验目的
使用STM32F429的普通IO口模拟IIC时序，来驱动AP3216C传感器模块，从而检测环境光强度（ALS）和接近距离（PS）这类环境参数，并作出反馈。

在实际使用中，还学习了LCD显示屏的使用方法。
== 实验原理
本次实验使用的环境传感器为AP3216C，这是敦南科技推出的一款三合一环境传感器，它包含了：数字环境光传感器（ALS）、接近传感器（PS）和一个红外LED（IR）。该芯片通过IIC接口和MCU连接，并支持中断（INT）
输出。AP3216C的框图如图2所示。

#figure(
  image("2.png", width: 70%),
  caption: [AP3216C 框图],
)

== 代码描述

#include_code_file("../代码/6.c","main.c 片段", "c")

== 实验结果
在本次的实验中，修改了部分代码，没有显示参数值，取而代之的是一个会随着光照强度和距离远近而变化面积的圆。具体表现是,当距离越近或光照强度越大时,圆半径越大.可以通过按键 _KEY_UP_ 切换检测光照和检测距离的检测模式。

== 心得体会
在 `lcd.h` 头文件中内置了许多图形&字符绘制的函数，可以多加利用；光照传感器的值是非线性的，因此用 sqrt 将其映射为相对线性值，便于观察；当绘制的圆形超出了LCD屏幕的左右边界时，根据其绘制策略，可以看到“反射”回来的“波纹”，比较有意思。
