泰凌微8258芯片的GPIO_PC4可以作为PWM反相输出引脚。舵机通常由PWM信号控制,一般周期为20ms(50Hz),脉冲宽度在0.5ms到2.5ms之间对应0度到180度。步骤:初始化PWM模块,设置PWM频率为50Hz(周期20ms)。配置GPIO_PC4为PWM输出功能。根据舵机角度计算脉冲宽度,并设置PWM占空比。注意:由于GPIO_PC4是反相输出,意味着输出的PWM波形是反相的。通常舵机控制信号是高电平脉冲,反相后则变成低电平脉冲。但舵机实际上是根据脉冲的持续时间来识别,而不是电平的高低。但是,通常舵机控制信号是正脉冲,所以如果使用反相输出,我们需要调整占空比的计算方式,使得反相后的脉冲宽度仍然符合要求。实际上,反相输出意味着正常PWM输出为高电平的时间,在反相输出上为低电平,反之亦然。因此,如果我们希望反相输出一个占空比为d的PWM波形,那么实际上我们应该设置PWM模块的占空比为1-d(如果d是相对于周期的比例)。但是,舵机控制信号要求的是正脉冲宽度,如果我们使用反相输出,则实际输出的脉冲是负脉冲,这可能会导致舵机不工作。因此,我们需要确保硬件连接上能够处理反相信号,或者使用一个非反相的输出引脚。如果必须使用这个反相引脚,我们可以通过调整占空比来使得反相后的正脉冲(即低电平时间)宽度符合要求,但这需要硬件上的配合(例如,舵机信号线接的是低电平有效?)或者使用反向器电路。然而,通常舵机信号是正脉冲,所以反相输出会得到负脉冲,这不符合舵机的要求。因此,如果硬件设计已经固定,使用反相输出引脚直接驱动舵机可能无法正常工作。在这种情况下,我们可以考虑:方案1:更换到非反相输出的PWM引脚。
方案2:在软件上调整,将占空比设置为(周期-脉冲宽度)来使得反相后的正脉冲(低电平)宽度为我们需要的脉冲宽度。但是注意,反相输出后,整个波形反相,所以原本的高电平脉冲变成了低电平脉冲,而低电平变成了高电平。舵机需要的是正脉冲,所以如果我们希望舵机看到的是正脉冲,我们可能需要一个外部反相器(如三极管)将信号再次反相。但是,如果硬件设计已经使用这个反相输出引脚直接连接舵机,那么我们必须让这个反相引脚输出一个反相的PWM波形,使得经过反相后,舵机接收到的信号是正脉冲。实际上,这相当于我们想要输出的脉冲宽度是x,那么我们就让PWM模块输出一个占空比为(周期-x)的波形,这样反相后,正脉冲的宽度就是x。例如,我们希望输出0.5ms的正脉冲,那么反相输出引脚应该输出一个19.5ms的正脉冲和0.5ms的负脉冲(因为反相,所以实际舵机信号线上是0.5ms的正脉冲和19.5ms的负脉冲)。但是舵机只关心正脉冲的宽度,所以这样是可以的。但是请注意,舵机通常要求周期为20ms,所以我们的PWM周期仍然是20ms。因此,具体设置如下:
假设我们需要脉冲宽度为t(介于0.5ms到2.5ms),则反相输出引脚应该输出的正脉冲宽度为20ms - t,占空比 = (20ms - t) / 20ms。但是,由于反相输出引脚的特性,PWM模块输出的波形是反相的,所以如果我们设置PWM模块输出正脉冲宽度为20ms-t,那么反相后的波形就是正脉冲宽度为t。然而,在PWM模块中,我们设置的是高电平的时间,还是占空比的值?这取决于PWM模块的配置。通常,PWM模块可以设置占空比,我们可以通过设置占空比来调整高电平时间。因此,我们需要:
周期T = 20ms,频率50Hz。
对于角度0度,需要脉冲0.5ms,则反相输出引脚需要设置高电平时间为20-0.5=19.5ms,占空比=19.5/20=97.5%。
对于角度180度,需要脉冲2.5ms,则反相输出引脚需要设置高电平时间为20-2.5=17.5ms,占空比=17.5/20=87.5%。但是注意:反相输出引脚会将这些波形反相,所以舵机实际上会看到:
0度:高电平时间0.5ms,低电平时间19.5ms。
180度:高电平时间2.5ms,低电平时间17.5ms。这正是我们需要的。所以,步骤:初始化PWM,设置周期为20ms(