找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8792|回复: 19
收起左侧

16路舵机控制板pca9685的stm32驱动程序源码

  [复制链接]
ID:205843 发表于 2018-4-17 16:13 | 显示全部楼层 |阅读模式
最近要做个六足机器人,所以买了个舵机控制板,而商家给的是arduino的代码,我用的是stm32,
自己就看了挺多文档,一开始总是不行,
在网上请教了几个大神,终于成功
写出了pca9685的驱动代码(测试成功)。
在这里分享给需要的人。

单片机源程序如下:
  1. #include "pca9685.h"
  2. #include "myiic.h"
  3. #include "delay.h"
  4. #include "math.h"
  5. void pca_write1(u8 adr,u8 data)
  6. {
  7.          IIC_Start();
  8.         
  9.          IIC_Send_Byte(pca_adr1);
  10.          IIC_Wait_Ack();
  11.         
  12.          IIC_Send_Byte(adr);
  13.          IIC_Wait_Ack();
  14.         
  15.          IIC_Send_Byte(data);
  16.          IIC_Wait_Ack();
  17.         
  18.    IIC_Stop();
  19. }
  20. u8 pca_read1(u8 adr)
  21. {
  22.   u8 data;
  23.         IIC_Start();
  24.         
  25.         IIC_Send_Byte(pca_adr1);
  26.   IIC_Wait_Ack();
  27.         
  28.         IIC_Send_Byte(adr);
  29.         IIC_Wait_Ack();
  30.         
  31.         IIC_Start();
  32.         
  33.   IIC_Send_Byte(pca_adr1|0x01);
  34.   IIC_Wait_Ack();
  35.         
  36.         data=IIC_Read_Byte(0);
  37.   IIC_Stop();
  38.         
  39.         return data;

  40. }

  41. void pca_reset1(void)
  42. {
  43.         IIC_Init();
  44.   pca_write1(pca_mode1,0x0);

  45. }

  46. void pca_setfreq1(float freq)
  47. {
  48.                 u8 prescale,oldmode,newmode;
  49.                 double prescaleval;
  50.                 freq *= 0.92;
  51.                 prescaleval = 25000000;
  52.                 prescaleval /= 4096;
  53.                 prescaleval /= freq;
  54.                 prescaleval -= 1;
  55.                 prescale =floor(prescaleval + 0.5f);

  56.                 oldmode = pca_read1(pca_mode1);
  57.         
  58.                 newmode = (oldmode&0x7F) | 0x10; // sleep
  59.         
  60.                 pca_write1(pca_mode1, newmode); // go to sleep
  61.         
  62.                 pca_write1(pca_pre, prescale); // set the prescaler
  63.         
  64.                 pca_write1(pca_mode1, oldmode);
  65.                 delay_ms(2);
  66.         
  67.                 pca_write1(pca_mode1, oldmode | 0xa1);
  68. }

  69. void pca_setpwm1(u8 num, u32 on, u32 off)
  70. {
  71.                         pca_write1(LED0_ON_L+4*num,on);
  72.                         pca_write1(LED0_ON_H+4*num,on>>8);
  73.                         pca_write1(LED0_OFF_L+4*num,off);
  74.                         pca_write1(LED0_OFF_H+4*num,off>>8);
  75. }




  76. void pca_write2(u8 adr,u8 data)
  77. {
  78.          IIC_Start();
  79.         
  80.          IIC_Send_Byte(pca_adr2);
  81.          IIC_Wait_Ack();
  82.         
  83.          IIC_Send_Byte(adr);
  84.          IIC_Wait_Ack();
  85.         
  86.          IIC_Send_Byte(data);
  87.          IIC_Wait_Ack();
  88.         
  89.    IIC_Stop();
  90. }
  91. u8 pca_read2(u8 adr)
  92. {
  93.   u8 data;
  94.         IIC_Start();
  95.         
  96.         IIC_Send_Byte(pca_adr2);
  97.   IIC_Wait_Ack();
  98.         
  99.         IIC_Send_Byte(adr);
  100.         IIC_Wait_Ack();
  101.         
  102.         IIC_Start();
  103.         
  104.   IIC_Send_Byte(pca_adr2|0x01);
  105.   IIC_Wait_Ack();
  106.         
  107.         data=IIC_Read_Byte(0);
  108.   IIC_Stop();
  109.         
  110.         return data;

  111. }

  112. void pca_reset2(void)
  113. {
  114.         IIC_Init();
  115.   pca_write2(pca_mode1,0x0);

  116. }

  117. void pca_setfreq2(float freq)
  118. {
  119.                 u8 prescale,oldmode,newmode;
  120.                 double prescaleval;
  121.                 freq *= 0.92;
  122.                 prescaleval = 25000000;
  123.                 prescaleval /= 4096;
  124.                 prescaleval /= freq;
  125.                 prescaleval -= 1;
  126.                 prescale =floor(prescaleval + 0.5f);

  127.                 oldmode = pca_read2(pca_mode1);
  128.         
  129.                 newmode = (oldmode&0x7F) | 0x10; // sleep
  130.         
  131. ……………………

  132. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
pca9685.rar (272.63 KB, 下载次数: 344)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:313453 发表于 2018-4-23 22:49 | 显示全部楼层
楼主还在吗,我下载了你的程序到我的单片机里面,连接了pca9685与舵机,可是舵机依然不转动。。。。。我很急很急,有很多的问题想问你,请问你的联系方式
回复

使用道具 举报

ID:316013 发表于 2018-4-26 14:05 | 显示全部楼层
我也很想请教
回复

使用道具 举报

ID:205843 发表于 2018-5-11 13:27 | 显示全部楼层
我这个控制的是两块板子的
回复

使用道具 举报

ID:205843 发表于 2018-5-11 13:29 | 显示全部楼层
1355965609 发表于 2018-4-23 22:49
楼主还在吗,我下载了你的程序到我的单片机里面,连接了pca9685与舵机,可是舵机依然不转动。。。。。我很 ...

我写的是控制两块板子的
回复

使用道具 举报

ID:295226 发表于 2018-5-24 11:34 | 显示全部楼层
楼主请问:
1. 你两个驱动板的基地址是怎么焊接的?一个是0x80,另一个是0x82,请问是怎么焊接的?
2. void SetPWM(uint32_t num,uint32_t on,uint32_t off) 这个函数中,num是不是就是第n个舵机,on是开始角度,off是停止角度?
3. LED0_ON_L和LED0_OFF_L是什么意思?感激不尽啊!!!
能不能加楼主联系方式
回复

使用道具 举报

ID:337376 发表于 2018-5-24 16:20 | 显示全部楼层
很棒,谢谢楼主分享
回复

使用道具 举报

ID:77462 发表于 2018-6-12 09:29 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:224179 发表于 2018-6-12 17:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:401931 发表于 2018-10-1 00:38 | 显示全部楼层
不错,完全没问题。。谢谢
回复

使用道具 举报

ID:401931 发表于 2018-10-1 00:48 | 显示全部楼层
请问楼主pca_setpwm(15,0,pwm_td); 第二个参数代表什么?谢谢
回复

使用道具 举报

ID:405076 发表于 2018-10-4 22:52 | 显示全部楼层
楼主啊,你的程序备注有点少啊,理解起来有点困难啊,不过还是谢谢了
回复

使用道具 举报

ID:366441 发表于 2018-10-11 22:20 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:298898 发表于 2018-10-26 17:20 | 显示全部楼层
怎么接线的啊,我的连上三个mg995,就动不了了????
回复

使用道具 举报

ID:138247 发表于 2019-3-1 10:15 | 显示全部楼层

感谢楼主分享。。。。
回复

使用道具 举报

ID:413119 发表于 2019-4-5 19:25 | 显示全部楼层
感谢分享感谢分享
回复

使用道具 举报

ID:439191 发表于 2019-5-30 11:09 | 显示全部楼层
正好需要,谢谢楼主.
回复

使用道具 举报

ID:450030 发表于 2019-8-3 09:09 | 显示全部楼层
备注有点少
回复

使用道具 举报

ID:594528 发表于 2019-8-3 11:14 | 显示全部楼层
感觉挺不错,不过我币不足
回复

使用道具 举报

ID:415668 发表于 2019-10-9 00:03 | 显示全部楼层
整洁到一条注释都没有。。。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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