lkc8210 发表于 2024-12-31 17:40 后面在电路中加了个电容解决了,只是不加按键消抖的话按键有时有点不灵敏,可能按键用久了也不太好用,加上消抖的话会有什么其他问题吗,之前经常这样用 这个中值滤波我试了,通电的时候会自己亮,而且按键也完全不起作用了,是不是跟我的电路不太匹配呀,我把我的电路贴到上面了 |
coody_sz 发表于 2024-12-31 15:18 官方的电路是在官网看吗 我只看到一个触摸按键的演示视频,还是是在论坛里面搜索呀 |
WL0123 发表于 2024-12-31 11:01 谢谢大神,加上电容确实解决了,只是不加软件防抖的话有时按键会失灵,估计是按键也有点问题,加上软件防抖的话会有其它什么问题吗 |
zhuls 发表于 2024-12-31 11:00 确实在开机时会高亮一下,大神有没有什么解决办法,我试过在开机的时候让IO口直接等于0,还是不行 |
的确里面的延时没有任何意义
这样看起来简洁一些 |
WL0123 发表于 2024-12-31 15:41 之前好像是要先声明才能使用的,但是现在的编译器是可以这样写的。 |
|
1. adc_value 在Check_Keys()函数内是不变的,if()delay()if的多余的,不要死抄按键消抖 2. 主循环的set_duty_cycle(brightness)也很多余,Check_Keys()函数内有按键已经运行一次了,不用在主循环不断运行 3. 可以试试中值滤波
|
zhuls 发表于 2024-12-31 13:46 你仔细看了楼主的代码吗? |
| 可以参考STC官方的ADC键盘电路,16个键的。 |
WL0123 发表于 2024-12-31 11:22 ![]() 你老师说的吗? 还是你师傅教的? 或是你哪本书上看到的? 这好象说不过去啊,也不影响什么的。。 |
|
不宜在主循环内定义变量 // 主函数 void main(void) { int adc_value; P5M0 = 0x00; P5M1 = 0x10; // 设置P5.4为高阻输入 P3M0 = 0x08; P3M1 = 0xf7; // P3.3为推挽输出 System_Init(); light_init(); //使用定时器0作pwm功能 delay_ms(5); EA = 1; while (1) { adc_value = Read_ADC(); // 读取ADC值 delay_ms(10); Check_Keys(adc_value); // 检查按键 set_duty_cycle(brightness); } } |
| stc8g1k08a有现成的硬件PWM不用?定时器中断频率过高有可能影响ADC。ADC连续采样3次,抛弃前两次数据,以第3次数据为准或连续采样8-10次取平均值。ADC输入端加1K电阻和102电容组成低通滤波。 Check_Keys函数去掉delay_ms(10),不需要软件防抖。 |
|
AD按键串,要没按键时,电压确实是高的,约=于电源电压。除非你的接法比较另类。 10bit的ADC,分5档有4个节点,平均每节点相差256个计数,为了容错,节点上下+-128个计数: 0档<=128; 1档<=384,>128; 2档<=640,>384; 3档<=896,>640; 4档>896; 基实,人眼对光的敏感度并不是线性的,所以,“0、25%、50%、75%、100%”的值不一定适合。。 在数据处理时,0档和4档不需要输出PWM,直接IO出低电平或出高电平; ADC在采样时要有数字滤波比较好。 然后就是按键的接触电阻要稳定、分压电阻要稳定。。 === 我曾用电位器调整ADC的值,来控制PWM输出实现无级调光,好用是好用,但发现有2个缺点, 就是在某些范围内的占空比时,明显看到灯会闪,不同的频率周期,这个范围也不尽相同, 可能软件还要做个关于PWM的周期与占空比的适配。。 另一个问题是,只要配置了PWM,IO就输出高电平,然后再按PWM配置输出占空比, 表现为开机时灯会高亮一下,再按PWM显示亮度。。 =====这是一个宿醉刚起、头脑尚未完全清醒者的发言==== ====以内容上仅供参考,不负任何法律或道义上的责任==== |
|
首先Check_Keys中的delay_ms(10);没什么作用,因为adc_value在Check_Keys运行时就不会改变,加上延迟指也是不会变的。然后Read_ADC没做滤波,这两个方面处理下应该好很多 |
|
官方的解释是你的外围电路做的不好 请按手册来画 |