脉宽调制
PWM波,调整数字信号的占空比(如5v和0v,只存在高电平和低电平)
5v,50%占空比,滤波之后,就能输出2.5v
复用GPIO作为TIM的PWM信号输出口
TIM配置为PWM模式配置占空比
呼吸灯的PWM波的每个占空比都占用1ms时间(延迟)
一共100%,每个占空比都占1ms发光,实现呼吸灯
一片伟大的净土
灵魂的归处,肉体的坟墓。PWM波,调整数字信号的占空比(如5v和0v,只存在高电平和低电平)
5v,50%占空比,滤波之后,就能输出2.5v
复用GPIO作为TIM的PWM信号输出口
TIM配置为PWM模式配置占空比
呼吸灯的PWM波的每个占空比都占用1ms时间(延迟)
一共100%,每个占空比都占1ms发光,实现呼吸灯
噎死啊
我草
我突然想到这种可以写文字小说
两个按钮
或者方式做多一点 光敏白天增加buff 晚上增加buff 跟随职业变化 吸血鬼晚上加强
热敏
红温的时候攻击力上升
小学生手腕结印(拳皇招式对打)
脉搏检测心率高的时候加buff
那些密室逃脱也可以做这些东西增加仪式感 而不是用手机软件
比如某些仪式 器件
噎死个
类似烛光启航的游戏交互
老员工原话:
原则上能不延时就不延时,有些通讯协议可能要延时几微秒
正经项目都不延时(硬件上直接解决)
8位单片机也可以使用32位变量,这是编译器解决的事情
延时去抖显然在主循环里面会卡全部的进程,要延时就在外部中断里面延时
但显然的是,外部中断延时也会导致外部中断多次判断的时候会少判。
软件延时:机械按钮按下有一部分误差电压,大概20ms,需要去除
原理就是读到了,等20ms,再读一次,确保是按下了
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频,不分频
DIV2则为时钟主频除以2
TIM_TimeBaseStruct.TIM_Prescaler = 7199; // 预分频器(PSC)
设置每秒数几次,有具体算法
TIM_TimeBaseStruct.TIM_Period = 9999; // 自动重装载值(ARR)
定义了定时器计数器的最大值。当计数器达到这个值时,会触发一次溢出事件(或更新事件),并重新从 0 开始计数。有具体算法
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
向上计数模式:计数器从 0 开始递增,直到达到自动重装载值(ARR),然后重新从 0 开始。
tip:codebase是指当前项目里面的所有文件(有关联的)
是否要在中断里面运行代码,看具体需求(满足实时性)
如果不急就放主程序,有影响就放中断
中断不能放太多,尽量少放(要求速度快就放在中断里面)
基本没有那如果多次触发中断 放到主程序里面运行 来不及触发第二次怎么办的情况(老工程师的回答,一般有的话也不是8位机能干的了)
写函数以面向对象方法来写,比如A3start,而非startA3
switch 语句:
跳跃表(Jump Table):switch 语句通常用于多个离散的整数值判断。编译器可以生成跳跃表,通过索引直接跳转到相应的代码块,效率较高。
适用场景:
离散的整数值:当条件是多个离散的整数值时,switch 语句效率更高。
大量条件:当条件较多时,switch 语句的效率通常优于 if 语句。
常量条件:switch 语句中的条件必须是常量表达式。
在函数中如果要保持变量不变,需要static,如果没有会随着函数消失而重置