Arduino的定时器1控制4个9g舵机

本文介绍了一个使用Arduino进行舵机控制的实例,通过定时器模拟PWM信号实现对四个9g舵机的精确控制。代码详细展示了如何设置引脚、初始化定时器、配置中断以及控制舵机的动作序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define  gear1    10           //定义舵机1引脚
#define  gear2    11           //舵机2引脚
#define  gear3    12           //舵机3引脚
#define  gear4    13           //舵机4引脚   
#define  average    5000           //  5000us    20000us内控制完4个舵机,每个舵机分为5000us

int flag = 1;              //舵机启动/停止

int start = 0;
int pwm[4] = {1500,1500,1500,1500};                 // 范围在500~2400us
void servo_run(int k,int l,int m, int n);           //范围在500~2400us 
void initTime1();
void timer1(int value);


void setup()
{
  Serial.begin(9600);
  pinMode(gear1, OUTPUT);
  pinMode(gear2, OUTPUT);
  pinMode(gear3, OUTPUT);
  pinMode(gear4, OUTPUT);
 
}

void loop()
{ 
  servo_run(1000,0,0,0);        //第一组动作
  delay(2000);                  //等待动作执行完毕
  servo_run(2000,0,0,0);        //第二组动作
  delay(2000);
//  while(1);                //停止在第二组动作
////  flag = 0;             //停止舵机
}
void initTime1()
{ 
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B = 0x0D;            //1024分频
  TIMSK1 |= (1 << TOIE1);  
 }
void timer1(int value)
{
   TCNT1 = 0xffff - value * 16 / 1024;
}

ISR(TIMER1_OVF_vect)
{
  static  int i = 1;
  if (flag) {
    switch (i)
    {
      case 1 :                                            //控制舵机1
        {
          digitalWrite(gear1, HIGH);
          timer1(pwm[0]);
        } break;
      case 2 :
        {
          digitalWrite(gear1, LOW);
          timer1(average - pwm[0]);
        } break;

      case 3 :                                            //控制舵机2
        {
          digitalWrite(gear2, HIGH);
          timer1(pwm[1]);
        } break;
      case 4 :
        {
          digitalWrite(gear2, LOW);
          timer1(average - pwm[1]);
        } break;

      case 5 :                                            //控制舵机3
        {
          digitalWrite(gear3, HIGH);
          timer1(pwm[2]);
        } break;
      case 6 :
        {
          digitalWrite(gear3, LOW);
          timer1(average - pwm[2]);
        } break;

      case 7 :                                            //控制舵机4
        {
          digitalWrite(gear4, HIGH);
          timer1(pwm[3]);
        } break;
      case 8 :
        {
          digitalWrite(gear4, LOW);
          timer1(average - pwm[3]);
        } break;
      case 9:
        {
          i = 0;
          timer1(1000);                     //1000us后进入case1
        }
      default: break;
    }
    i++;
   }
}

void servo_run(int k,int l,int m, int n)
{
        pwm[0] = k;  
        pwm[1] = l;
        pwm[2] = m;  
        pwm[3] = n;    
        initTime1();
        timer1(1000);               //给一个脉冲,进入中断
 }

定时器1中断,模拟PWM,控制9g舵机

定时器分时多用~~~ 理论上控制n路都可行

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值