stc32g12k128单片机控制舵机360旋转问题

stc32g12k128单片机控制舵机360旋转问题
舵机没反应
使用定时器0
晶振是22.1184mhz

程序为:

#include "stc32g.h"
#include "intrins.h"
#define duoji  P21
typedef unsigned int u16;    
typedef unsigned char u8;
u8 count=0;
u8 PWM_count=0;
void Delay1000ms()        //@22.1184MHz
{
    unsigned long i;

    _nop_();
    _nop_();
    i = 5529598UL;
    while (i) i--;
}


void time0_Init (void)
{
    
      AUXR |= 0x80;
      TMOD &=0xF0;
      TL0 = 0xCD;                
      TH0 = 0xD4;    
      TF0=0;
      ET0=1;
      EA=1;
      TR0=1;
}
void main()
 {
      EAXFR=1;
      CKCON=0x00;
      WTST=0x00;
     time0_Init ();
     while(1)
     { 
            PWM_count=5;      
            Delay1000ms();
              }
 }
        
void TM0_Rountime(void) interrupt 1
{
  TL0=0xCD;                
    TH0=0xD4;
    count++;
    count%=40;
    if(count1;
    else
        duoji=0;
}


```

这个程序看起来是在使用STC32G12K128单片机来控制舵机360度旋转,但是程序中并没有看到具体控制舵机旋转的部分。程序中使用了定时器0来控制PWM脉宽,但是没有具体说明如何连接舵机和单片机,以及如何控制舵机转动。建议进一步研究舵机的控制原理和连接方式,并将相关代码加入程序。我可以给出一个简单的示例代码来控制舵机,但是需要您提供舵机的具体连接方式和参数。

以下是一个简单的示例代码,使用STC32G12K128单片机来控制舵机360度旋转:

#include "stc32g.h"

#define SERVO_PIN P21  // 舵机连接的引脚
#define SERVO_MIN 1000  // 舵机最小脉宽
#define SERVO_MAX 2000  // 舵机最大脉宽

void delay_us(unsigned int us)
{
    while(us--)
    {
        _nop_();
        _nop_();
    }
}

void servo_init()
{
    P21_pushpull_out;  // 设置舵机引脚为输出
}

void servo_control(unsigned int angle)
{
    int pulse_width = SERVO_MIN + (SERVO_MAX - SERVO_MIN) * angle / 180;
    SERVO_PIN = 1;
    delay_us(pulse_width);
    SERVO_PIN = 0;
    delay_us(20000 - pulse_width);
}

void main()
{
    servo_init();
    while(1)
    {
        for(int i = 0; i <= 180; i++)
        {
            servo_control(i);
            delay_ms(15);
        }
        for(int i = 180; i >= 0; i--)
        {
            servo_control(i);
            delay_ms(15);
        }
    }
}

这段代码通过调整脉宽来控制舵机旋转到指定角度,最小脉宽和最大脉宽根据实际舵机需要调整。

需要注意的是,这段代码仅是一个示例,需要根据实际情况进行调整和完善。

这段程序的意图是使用STC32G12K128单片机控制舵机360度旋转,但是舵机没有反应。

具体问题可能有以下几点:

(1)程序里没有配置舵机的引脚。这段程序中,duoji是一个宏定义,它表示P21口。但是没有看到具体配置这个引脚作为舵机的控制端。

(2)PWM输出不足。这段程序中,PWM_count变量被赋值为5,这意味着PWM占空比只有5/40,可能不够控制舵机。

(3)延时函数Delay1000ms()不准确。这个函数里的循环次数是固定的,但是在不同的晶振下,循环次数需要相应的调整。

(4)中断函数的调用问题。这段程序中,中断函数TM0_Rountime()没有被正确调用。

(5)程序没有调试语句。如果程序有问题,通过调试语句可以帮助我们更好地定位问题。

建议你检查这些问题,并确保程序的正确性。