单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 81|回复: 0
收起左侧

stm32驱动pca9685源程序16路12位PWM信号发生器

[复制链接]
linuxke 发表于 2019-12-4 15:15 | 显示全部楼层 |阅读模式
pca9685是16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。在那个宝上随处可见,Arduino用它非常方便,不过STM32要想使用它必须要写好驱动才行,本文简述如何配置其驱动以及一些需要注意的地方。

STM32F103配置pca9685驱动
pca9685简介
pca9685驱动
pcf8574.h:
pcf8574.c:
应用与调试
pca9685简介
当然对于老手,看datasheet是最好的选择pca9685datasheet
对于我这种新手,自然是看高手的文章比较容易上手了~

我在网上看到的对pca9685总结的最好的一篇文章推荐给大家:生命不息折腾不止
博主写得非常详细,本文某些片段也是参考博主的这篇文章,在此致谢。

pca9685用的是IIC通信,如果有师兄对IIC不熟悉,要先去了解一下~

pca9685驱动
网上有不少写pca9685的文章,写驱动的也有,不过我试过的大多有错误,我详细地进行了修改,并且调试成功,走了不少弯路

#ifndef __PCF8574_H
#define __PCF8574_H
#include "sys.h"
#include "myiic.h"

#define PCA9685_adrr 0x80
#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4

#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE


#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9

#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD

void PCA9685_write(unsigned char reg,unsigned char data);
u8 PCA9685_read(unsigned char reg);
void setPWMFreq(u8 freq);
void setPWM(u8 num, u16 on, u16 off);
void down();
void up();

#endif

设置PWM波的频率,看下面这个公式即可:

其中osc_clock是时钟,根据上面的寄存器设置选择是内部25MHz时钟还是外部时钟。
update_rate是频率,比如周期是20ms,那么频率就是50。
注意:实际应用中发现有误差,需要加入校准,要把udpate_rate乘以0.915。

全部资料51hei下载地址:
f103 pca9685.7z (207.56 KB, 下载次数: 1)

评分

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

查看全部评分

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

本版积分规则

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

Powered by 单片机教程网

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