极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11755|回复: 1

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

[复制链接]
发表于 2016-6-12 07:03:05 | 显示全部楼层 |阅读模式
见到论坛,贴吧,有人说电调不能用analogWrite直接驱动,,
但本人经实测,499Hz下好盈电调仍然是有反应的,可以直接用,
也可以修改一下 analogWrite的PWM输出频率 改为122Hz
详情请看程序
  1. int val1;
  2. //int unlock = 0;
  3. int myangle1 = 0;
  4. //int out_limit = 40;
  5. //int basic_Power = 0;
  6. //int motor_PWM[4] = { 0,0,0,0 };
  7. //int x_ushiro_fix = 0.7;
  8. void servopulse(int val1)//定义一个脉冲函数
  9. {
  10.         myangle1 = map(val1, 0, 180, 500, 2480);
  11.         digitalWrite(MAE, HIGH);//将舵机接口电平至高
  12.         digitalWrite(MIGI, HIGH);
  13.         digitalWrite(USHIRO, HIGH);
  14.         digitalWrite(HITARI, HIGH);
  15.         delayMicroseconds(myangle1);//延时脉宽值的微秒数
  16.         digitalWrite(MAE, LOW);//将舵机接口电平至低
  17.         digitalWrite(MIGI, LOW);
  18.         digitalWrite(USHIRO, LOW);
  19.         digitalWrite(HITARI, LOW);
  20.         delay(20 - val1 / 1000);
  21. }
  22. void ESC_Prepare(int ESC_mode) {
  23.         //看电调说明书,设置油门行程时,一开始需要把遥控器打到最高点。i<=110大概是2杪多
  24.         if (ESC_mode == 0) {//重新设置行程;
  25.                 for (int i = 0; i <= 110; i++)
  26.                 {
  27.                         servopulse(150);//引用脉冲函数
  28.                 }
  29.         }
  30.         //等电机发出B-B两声后(就是两秒后,大概就是这里了)把油门打到最低点
  31.         for (int i = 0; i <= 55; i++)
  32.         {
  33.                 servopulse(20);//引用脉冲函数
  34.         }

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

  36.         delay(1000);
  37. }
  38. void motor_Prepare() {
  39.         pinMode(MAE, OUTPUT);
  40.         pinMode(USHIRO, OUTPUT);
  41.         pinMode(HITARI, OUTPUT);
  42.         pinMode(MIGI, OUTPUT);
  43.         //设置analogWrite()函数产生PWM的频率为 122Hz
  44.         TCCR1B = TCCR1B & 0xF8 | 4; /// 122.549
  45.         TCCR2B = TCCR2B & 0xF8 | 6; ///122.549
  46.                                                                 //设置analogWrite()函数产生PWM的频率为 defaultValue
  47.                                                                 //     TCCR1B =  TCCR1B & 0xF8 | 3; /// 490.196
  48.                                                                 //   TCCR2B =  TCCR2B & 0xF8 | 4; ///490.196
  49. }
复制代码

在setup()里面先后调用 motor_Prepare(),ESC_Prepare();
这样之后,就可以直接用analog写PWM了,比如,analogWrtie(9,motor_PWM[0]);
是不是很简单啊
回复

使用道具 举报

发表于 2016-6-12 11:28:20 | 显示全部楼层
学习中,思路很好!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 10:24 , Processed in 0.039293 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表