AilikeZ 发表于 2016-6-12 07:03:05

关于analogWrite()”无法“直接驱动电调的对策

见到论坛,贴吧,有人说电调不能用analogWrite直接驱动,,
但本人经实测,499Hz下好盈电调仍然是有反应的,可以直接用,
也可以修改一下 analogWrite的PWM输出频率 改为122Hz
详情请看程序int val1;
//int unlock = 0;
int myangle1 = 0;
//int out_limit = 40;
//int basic_Power = 0;
//int motor_PWM = { 0,0,0,0 };
//int x_ushiro_fix = 0.7;
void servopulse(int val1)//定义一个脉冲函数
{
        myangle1 = map(val1, 0, 180, 500, 2480);
        digitalWrite(MAE, HIGH);//将舵机接口电平至高
        digitalWrite(MIGI, HIGH);
        digitalWrite(USHIRO, HIGH);
        digitalWrite(HITARI, HIGH);
        delayMicroseconds(myangle1);//延时脉宽值的微秒数
        digitalWrite(MAE, LOW);//将舵机接口电平至低
        digitalWrite(MIGI, LOW);
        digitalWrite(USHIRO, LOW);
        digitalWrite(HITARI, LOW);
        delay(20 - val1 / 1000);
}
void ESC_Prepare(int ESC_mode) {
        //看电调说明书,设置油门行程时,一开始需要把遥控器打到最高点。i<=110大概是2杪多
        if (ESC_mode == 0) {//重新设置行程;
                for (int i = 0; i <= 110; i++)
                {
                        servopulse(150);//引用脉冲函数
                }
        }
        //等电机发出B-B两声后(就是两秒后,大概就是这里了)把油门打到最低点
        for (int i = 0; i <= 55; i++)
        {
                servopulse(20);//引用脉冲函数
        }

        //后面提示后,就可以控制电机转动了

        delay(1000);
}
void motor_Prepare() {
        pinMode(MAE, OUTPUT);
        pinMode(USHIRO, OUTPUT);
        pinMode(HITARI, OUTPUT);
        pinMode(MIGI, OUTPUT);
        //设置analogWrite()函数产生PWM的频率为 122Hz
        TCCR1B = TCCR1B & 0xF8 | 4; /// 122.549
        TCCR2B = TCCR2B & 0xF8 | 6; ///122.549
                                                                //设置analogWrite()函数产生PWM的频率为 defaultValue
                                                                //   TCCR1B =TCCR1B & 0xF8 | 3; /// 490.196
                                                                //   TCCR2B =TCCR2B & 0xF8 | 4; ///490.196
}
在setup()里面先后调用 motor_Prepare(),ESC_Prepare();
这样之后,就可以直接用analog写PWM了,比如,analogWrtie(9,motor_PWM);
是不是很简单啊

glmyc 发表于 2016-6-12 11:28:20

学习中,思路很好!
页: [1]
查看完整版本: 关于analogWrite()”无法“直接驱动电调的对策