标题: 16路舵机控制板pca9685的stm32驱动程序源码 [打印本页]

作者: leapyy    时间: 2018-4-17 16:13
标题: 16路舵机控制板pca9685的stm32驱动程序源码
最近要做个六足机器人,所以买了个舵机控制板,而商家给的是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, 下载次数: 345)



作者: 1355965609    时间: 2018-4-23 22:49
楼主还在吗,我下载了你的程序到我的单片机里面,连接了pca9685与舵机,可是舵机依然不转动。。。。。我很急很急,有很多的问题想问你,请问你的联系方式
作者: wyp987    时间: 2018-4-26 14:05
我也很想请教

作者: leapyy    时间: 2018-5-11 13:27
我这个控制的是两块板子的
作者: leapyy    时间: 2018-5-11 13:29
1355965609 发表于 2018-4-23 22:49
楼主还在吗,我下载了你的程序到我的单片机里面,连接了pca9685与舵机,可是舵机依然不转动。。。。。我很 ...

我写的是控制两块板子的
作者: 358811477    时间: 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是什么意思?感激不尽啊!!!
能不能加楼主联系方式
作者: xode    时间: 2018-5-24 16:20
很棒,谢谢楼主分享
作者: cqh757128    时间: 2018-6-12 09:29
谢谢分享
作者: Vong    时间: 2018-6-12 17:37
谢谢分享
作者: 顺子    时间: 2018-10-1 00:38
不错,完全没问题。。谢谢
作者: 顺子    时间: 2018-10-1 00:48
请问楼主pca_setpwm(15,0,pwm_td); 第二个参数代表什么?谢谢
作者: xuzongguo    时间: 2018-10-4 22:52
楼主啊,你的程序备注有点少啊,理解起来有点困难啊,不过还是谢谢了
作者: zkt95    时间: 2018-10-11 22:20
谢谢分享
作者: bzycxg    时间: 2018-10-26 17:20
怎么接线的啊,我的连上三个mg995,就动不了了????
作者: plj213    时间: 2019-3-1 10:15

感谢楼主分享。。。。
作者: PatrickStar    时间: 2019-4-5 19:25
感谢分享感谢分享
作者: nagatoxu    时间: 2019-5-30 11:09
正好需要,谢谢楼主.
作者: 吴昊浪    时间: 2019-8-3 09:09
备注有点少

作者: 1206827801    时间: 2019-8-3 11:14
感觉挺不错,不过我币不足

作者: 半盏生    时间: 2019-10-9 00:03
整洁到一条注释都没有。。。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1