标题:
16路舵机控制板pca9685的stm32驱动程序源码
[打印本页]
作者:
leapyy
时间:
2018-4-17 16:13
标题:
16路舵机控制板pca9685的stm32驱动程序源码
最近要做个六足机器人,所以买了个舵机控制板,而商家给的是arduino的代码,我用的是stm32,
自己就看了挺多文档,一开始总是不行,
在网上请教了几个大神,终于成功
写出了pca9685的驱动代码(测试成功)。
在这里分享给需要的人。
单片机源程序如下:
#include "pca9685.h"
#include "myiic.h"
#include "delay.h"
#include "math.h"
void pca_write1(u8 adr,u8 data)
{
IIC_Start();
IIC_Send_Byte(pca_adr1);
IIC_Wait_Ack();
IIC_Send_Byte(adr);
IIC_Wait_Ack();
IIC_Send_Byte(data);
IIC_Wait_Ack();
IIC_Stop();
}
u8 pca_read1(u8 adr)
{
u8 data;
IIC_Start();
IIC_Send_Byte(pca_adr1);
IIC_Wait_Ack();
IIC_Send_Byte(adr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(pca_adr1|0x01);
IIC_Wait_Ack();
data=IIC_Read_Byte(0);
IIC_Stop();
return data;
}
void pca_reset1(void)
{
IIC_Init();
pca_write1(pca_mode1,0x0);
}
void pca_setfreq1(float freq)
{
u8 prescale,oldmode,newmode;
double prescaleval;
freq *= 0.92;
prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
prescale =floor(prescaleval + 0.5f);
oldmode = pca_read1(pca_mode1);
newmode = (oldmode&0x7F) | 0x10; // sleep
pca_write1(pca_mode1, newmode); // go to sleep
pca_write1(pca_pre, prescale); // set the prescaler
pca_write1(pca_mode1, oldmode);
delay_ms(2);
pca_write1(pca_mode1, oldmode | 0xa1);
}
void pca_setpwm1(u8 num, u32 on, u32 off)
{
pca_write1(LED0_ON_L+4*num,on);
pca_write1(LED0_ON_H+4*num,on>>8);
pca_write1(LED0_OFF_L+4*num,off);
pca_write1(LED0_OFF_H+4*num,off>>8);
}
void pca_write2(u8 adr,u8 data)
{
IIC_Start();
IIC_Send_Byte(pca_adr2);
IIC_Wait_Ack();
IIC_Send_Byte(adr);
IIC_Wait_Ack();
IIC_Send_Byte(data);
IIC_Wait_Ack();
IIC_Stop();
}
u8 pca_read2(u8 adr)
{
u8 data;
IIC_Start();
IIC_Send_Byte(pca_adr2);
IIC_Wait_Ack();
IIC_Send_Byte(adr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(pca_adr2|0x01);
IIC_Wait_Ack();
data=IIC_Read_Byte(0);
IIC_Stop();
return data;
}
void pca_reset2(void)
{
IIC_Init();
pca_write2(pca_mode1,0x0);
}
void pca_setfreq2(float freq)
{
u8 prescale,oldmode,newmode;
double prescaleval;
freq *= 0.92;
prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
prescale =floor(prescaleval + 0.5f);
oldmode = pca_read2(pca_mode1);
newmode = (oldmode&0x7F) | 0x10; // sleep
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
pca9685.rar
(272.63 KB, 下载次数: 345)
2018-4-17 17:13 上传
点击文件名下载附件
pca9285驱动demo
下载积分: 黑币 -5
作者:
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