1 - 香橙派硬件PWM控制sg90舵机

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

本人机器电子专业的大一学生一枚,这是我在博客园的第一篇随笔
  2024年4月份我在二手平台泯灭300大洋入手了香橙派zero3和3B,买返来后一开始是装上ubuntu跑QQ呆板人和minecraft服务器的,所以虽然看到了板子上的40pin引脚,但当时并未立即探索其硬件扩展功能。几天后,好奇心驱使我深入了解这些引脚的用途,我开始研究香橙派的GPIO编程。故发表随笔来记载我的折腾之旅。
  180度舵机作为一种常见的执行机构,广泛应用于呆板人关节控制、摄像头云台调整等场景。要驱动舵机,关键在于理解PWM(脉冲宽度调制)信号的生成与控制。不过在香橙派上利用wiringPi来输出PWM不需要像stm32一样去设置各种寄存器,还算是方便一些。
  我们需要以下函数来输出硬件PWM波(以香橙派3B为例)
  1. 1 pinMode(int pin, int Mode); // 设置引脚为pwm输出,参数Mode为PWM_OUTPUT
  2. 2 pwmSetClock(int pin,int divisor); // 参数divisor为div
  3. 3 pwmSetRange(int pin,unsigned int range); // 参数range为arr
  4. 4 pwmWrite(int pin, int value); // 参数value为ccr
复制代码
   硬件PWM的频率是可调的,有适用于香橙派的计算公式
  1. 频率 = 24000000 / (arr * div);<br>占空比 = ccr / arr;
复制代码
  下面写一个控制sg90舵机旋转到45度处的代码
  1. 1 #include "wiringPi.h"
  2. 2 #include <stdio.h>
  3. 3 #define PWM_pin 21
  4. 4 //香橙派3B的硬件PWM输出引脚为wpi编号下的2和21号引脚,这里使用21号引脚
  5. 5 int main()
  6. 6 {
  7. 7     int div = 8;
  8. 8     int arr = 60000;
  9. 9     int ccr = 3000;
  10. 10    //频率= 24000000 / (60000 * 8) = 50Hz   sg90舵机要50Hz才能正常驱动
  11. 11    if (wiringPiSetup() == -1) {printf("初始化失败惹>︿<");}
  12. 12    pinMode(PWM_pin, PWM_OUTPUT);
  13. 13    while (1)
  14. 14    {
  15. 15        pwmSetClock(PWM_pin, div);
  16. 16        pwmSetRange(PWM_pin, arr);
  17. 17        pwmWrite(PWM_pin, ccr);
  18. 18        //占空比duty = ccr / arr = 5.0% 对应45度位置   
  19. 19    }
  20. 20 }
复制代码
  生存,命名为main.c
  我是用vscode远程连接到香橙派3B的,在控制台输入gpio readall就可以看到香橙派3B的引脚定义图。利用cd下令进入代码所在文件夹,输入
  1. [/code][code]orangepi@orangepi3b:my-project/ $ gcc main.c -o test1 -lwiringPi
复制代码
  然后再输入
  1. [/code][code]orangepi@orangepi3b:my-project/ $ sudo ./test1
复制代码
  按照提示输入密码后就可以看到舵机转到了45度处
  python的代码和c语言版本大同小异,如下
  1. 1 import wiringpi as pi
  2. 2 from wiringpi import GPIO
  3. 3
  4. 4 PWM_PIN = 21
  5. 5 div = 8
  6. 6 arr = 60000
  7. 7 ccr = 4500
  8. 8 if pi.wiringPiSetup() == -1:
  9. 9     print("初始化失败惹>︿<")
  10. 10 pi.pinMode(PWM_PIN,GPIO.PWM_OUTPUT)
  11. 11 while True:
  12. 12     pi.pwmSetClock(PWM_PIN, div)
  13. 13     pi.pwmSetRange(PWM_PIN, arr)
  14. 14     pi.pwmWrite(PWM_PIN, ccr) # duty = 7.5% 对应 90度
复制代码
  生存为main.py 然后以管理员身份执行
  1.    python3 main.py
复制代码
   是可以看到舵机转到了90度位置处

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表