完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在设定寄存器时要养成赋值好的习惯
这段时间一直在做平衡小车,本来想用超声波模块做。没有做成功,失败有很原因。 在这里我就说其中的一个问题。 我要说明的是:我用的是STC12C5A60S2单片机内部PWM(通过T0定时器的溢出作为时钟源),想实现这样的功能:通过超声波测出的距离,来调节单片机内部寄存器产生的PWM,并且通过无线蓝牙串口将距离和PWM的大小传给电脑的串口调试助手。 我把程序烧入到单片机中,奇怪的 发现我的PWM周期有2.33s,而我实际设定的是50ms。 为什么会这样我一开始以为我的逻辑分析仪有问题,我后来有用示波器测。结果周期还是2.33s 从而我可以断定是我的程序有问题。 程序为什么会有问题,我就把和PWM、串口发送数据无关的语句都删除掉。还是没有发现问题。 我怀疑我用的单片机是坏的,因为我上个星期做ADC时就发现单片机的一个IO口烧坏了。 但是我换了一个新的单片机试试,但是还是那样。 我后来怀疑是我的中断优先级的问题( 1我用定时器T0定时器的溢出作为PCA的时钟源 通过改变TL0和TH0可以改变PWM的周期 2用独立波特率是用来用过蓝牙串口将超声波模块测出的距离发送到电脑的串口调试助手上 3用了PCA的定时器 通过比较PCA定时器的CL CH 和CCAP0H的值决定PWM输出IO口输出的是高电平还是低电平 )后来我想了一下,我只用了串口中断,T1定时器中断 。而关于这两个中断的程序都运行正常。 后来我很无奈,我之后把和PWM无关的程序注释掉,一部分一部分的排除后来我发现我只要调用T1定时器PWM就运行的不是50ms,而是2.33s的周期。从而我猜测可能是T1定时器初始化影响到了T0定时器。 后来果然找到了问题,现在我来讲一下我的问题根源: 不知道大家看到我贴出的图片知道问题出在那里吗? 没看出来没关系,我在贴出一组图片来。 我相信大家看到这里来应该知道问题出在哪里了吧 就是因为我要用两个定时器,而设置定时器工作模式的时候我先设定定时器0工作方式2(8位自动重装) TMOD=OX02,后来有设置定时器T1工作方式为1(16位定时器) TMOD=0X10。这样最终单片机中的TMOD其实只是0000 0001 (这样的意思是定时器T0工作为方式0(13位定时器/计数器)定时器T1工作方式为方式1(16位定时器)),这样其是并不是我们想要的。所以我们在设定寄存器是不应该这么写,如:TMOD=0X10。这样写存在这安全隐患。应该这么写TMOD|=0X10; 多了一个这样的符号“ | ”,就不会出现我今天下午碰到的问题。 在这里我贴上两张示波器测出的波形。 下面这张是修改之前: 修改之后: 希望大家引以为鉴,不要犯和我一样的错误,这样不仅会浪费你的时间和精力,很有可能让你对单片机失去信心。 |
|
|
|
2183 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2011 浏览 3 评论
4612 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2154 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2687 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:53 , Processed in 0.552688 second(s), Total 64, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号