在C语言中
!表示数值取反
~ 表示按位取反
今天在驱动舵机时,写了个判断,当i=100时,方向dir取反。
这里dir定义的是uint8_t,初值为1;i定义的是uint16_t;初值为499;因为是舵机,控制定时器的CCR1在499~2499之间,以使舵机在这个范围内正反转。为啥不用uint8_t,因为数值大于256,uint16_t可以到65535;一般不用int,因为数值太大。
这里可以说一下为啥用uint8_t
在不同的单片机中,有位数的区别,比如8位,16位,32位,他们位数的不同会导致在编译int型数据的时候有区别,8位和16位在编译的时候有可能会编译成2个字节,也就是16位,所以为了统一,就使用uint32重新定义,uint后的数字就代表位数。32位的数据就是4个字节。
改变方向时我使用了
~dir
结果舵机一到180°就跑飞,猛转。
我反复检查代码,好像也没有哪里有问题
我按照朴素的判断写法,它又没问题了,最终我把问题定位在了~dir中
当我换一种写法,!dir时,它就好了。
我寻思这两个不是一样的吗?
都是取反的意思,一个按位取反,一个以数值为基准取反。
按位取反基于你的数据的类型,不论是8位,16位还是32位,在单片机看来都是二进制的数据。它会将这个数据以二进制的形式进行取反。
也就是说我定义的dir = 1;在单片机看来就是0001,取反之后就是1110;所以出现了错误。
而!是按数值进行取反,所有非零的都变成0,0变成非零