你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32使用硬件IIC操作DAC芯片MCP4726输出锯齿波
[复制链接]
sxdahss
发布时间:2018-1-18 09:08
文章
文章封面:
-
文章简介:
-
本帖最后由 sxdahss 于 2018-1-18 09:38 编辑
. o& a* V* W5 q' E9 {
9 P6 _. |3 {, T/ o5 H! C
平台STM32F103,采用硬件IIC操作MCP4726芯片,IIC的速度设置在1.2M测试很稳定,MCP4726芯片手册介绍如下,并附上中文手册
MCP4726䏿.pdf
(15.45 MB, 下载次数: 434)
2018-1-18 09:01 上传
点击文件名下载附件
1 r+ g& r8 b; u l
特性
# j7 k& I0 m; E! ^: J3 [, }: K, S9 q
• 输出电压分辨率
4 Y: Z# d. W) {
- 12位: MCP4726
" r/ T& R( N7 C
- 10位: MCP4716
5 J+ A6 k$ m8 ?8 _0 L2 ?% ?6 ^/ E3 O
2 @! l1 v+ B; N$ z
- 8位: MCP4706
8 K. A9 f0 q' E$ ?# ?# t
• 轨到轨输出
4 a! R1 U1 _) z4 o3 P. j+ i
• 快速稳定时间:6 μs (典型值)
2 _' D; `, a9 D
• DAC 电压基准选项
. @! B) K5 u8 H# @$ p
- VDD
; d& B" W4 x8 q9 t1 ~+ }# k1 d
- VREF 引脚
X& g8 E& r% w) y, m* T
• 输出增益选项
* j& @$ G! D$ |( x9 ~3 s' d" f
- 单位增益(1x)
2 ?) @& U6 |) T
- 2x(仅在VREF 引脚用作电压源时)
1 `% ~! G7 [4 a! x$ x* R
• 非易失性存储器(EEPROM)
, S2 K, s6 S. R; h
- 自动重新调用已保存的DAC 寄存器设置
' ^; M: N2 T* ]4 ]3 {" B: T4 L
- 自动重新调用已保存的器件配置(电压基准、
" A; P' A: q x5 J# l5 |
增益和掉电配置)
7 W+ n5 f2 n' S8 P+ h& e" t
• 掉电模式
' U: z" k3 ^, f' e6 P
- 断开输出缓冲器
* E# A9 }; n, |: ]! m4 d
- VOUT下拉电阻选择(640 kΩ、125 kΩ或1 kΩ)
/ }3 K, s2 j1 e o) @& r1 v! F5 k
• 低功耗
) ~0 ^6 V9 R2 R6 b u0 A% D( A
- 正常工作:210 μA (典型值)
2 Q3 g+ e% e7 L, t5 _3 r
- 掉电工作:60 nA (典型值)
6 L& Y* c1 F. ~; u o/ j
(PD1
D0 = 11)
# A% ~ j2 @ u* {" i( ]% G- @6 @/ S9 K- c$ c
• 单电源工作:2.7V 至5.5V
! `) M d6 J4 ?* V5 M! t/ ^5 W
• I2C™ 接口:
5 u* g2 [, v1 M
- 8个可用地址
+ s u, a+ ?6 Q( w* M
- 标准(100 kbps)、快速(400 kbps)和高速
$ X& l5 r% }% I8 J
(3.4 Mbps)模式
' m5 `9 u, [2 a4 I d
• 小型6 引脚SOT-23 和DFN (2x2)封装
' Z# t/ o# F( K' q0 | t. W2 M) |
• 扩展级温度范围:-40°C 至+125°C
. }" l# `) L0 N! y
#include "mcp4726.h"
9 z7 \7 Y5 L$ q6 q- N8 X% [/ Q5 M$ Y2 p
: Z1 s1 T+ G3 B3 P5 I: o( c2 d2 u
) C: d% W% w7 w' Y& B2 L
/* 命令位 VREF1 VREF0 PD1 PD0 G
2 Y( m- l1 | ?' @. M ^
1.命令位 //MCP47X6 支持的命令
+ n5 y/ D, Z. P! _1 ]
C2 C1 C0
& `6 m+ b& p, |
0 0 x 写易失性DAC 寄存器命令
; C9 G: A- C8 Z5 u/ v, R8 P
0 1 0 写易失性存储器命令
3 `$ p' f1 n- h, I0 p: \2 ?9 Q
0 1 1 写所有存储器命令
+ e, g: L% b# c: o- ]2 Y" p
1 0 0 写易失性配置位命令
% D U4 b( T: S9 j7 S: Y5 d* a$ t. q
* @8 ?, h9 g/ G; g4 o: v' u
2.VREF1 VREF0 梯形电阻网络电压基准(VRL)选择位
+ E0 Y& W' N1 r) k! q4 e. ^" i
0 x VDD 无缓冲
H& [6 a- D& t) {& w9 i% ~( |5 p
1 0 VREF引脚 无缓冲
) v( g+ _8 }# m/ j3 J! O
1 1 VREF引脚 缓冲
2 L5 b2 I. s/ B) R6 \9 t
3.PD1 PD0
- p K% A' n$ b
0 0 正常工作
8 N. b/ @3 y6 o$ f p
0 1 1KΩ电阻接地
- q( M' j5 h3 c: s" c/ ]# Q% J- P
1 0 125KΩ电阻接地
& l3 t! p1 S1 A; }
1 1 640KΩ电阻接地
k) G! G1 M. t. @5 z+ U
4.G 增益选择位
& A- q- d1 U U0 _0 t
0 =1x (增益为1)
" k9 m; D, g0 k) z
1 =2x (增益为2) VDD作VRL不适用
0 |- u6 m2 S- H- e1 ?+ g9 N
*/
. V" p* G0 {8 |% B* @9 u
// C2 C1 C0 VREF1 VREF0 PD1 PD0 G
+ `% a: L3 X! h
// 1 0 0 1 1 0 0 0 0x98 写易失性配置位命令
; I8 X- D: ?. N. R. X+ H) {
: s r) b7 ]: |0 Z1 I+ L
//写配置
U6 }% g7 h3 R, v
void MCP4726_Writecmd(u16 data)
/ I( P! Q' m0 E4 T; M
{
% ]/ C. Z4 |. A9 m$ s- Q7 h
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
- n9 J* t: W, ^1 b. E
/*起始位*/
3 s% ]( S% k, ~! m1 D
I2C_GenerateSTART(I2C2, ENABLE);
/ V+ ~, l6 v0 l* j5 U, a" q+ B
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
?. \ T& P- x5 q$ y: d' u
& ?! |* `# C5 _" }* W% P& U
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
- S! Q1 i; s! W q" t3 g" m1 D
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
* N4 r* O0 G: P2 A/ T$ T1 ]
/* Send data */
# h, l/ f9 L* r& h2 b+ Q
I2C_SendData(I2C2, data);
" p! {' d3 ~+ f+ ^. Q
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
8 z$ ~, |+ V6 I' \3 x
/*停止位*/
3 X; R! x( I: Q# W: M1 @+ A
I2C_GenerateSTOP(I2C2, ENABLE);
4 K7 P2 Z3 B; r7 ^
+ Y2 u4 B9 f# }: G; J
}
: t$ ]1 Q0 c" H4 m7 w& O7 N& m
6 Q. i7 v8 O' Y* C4 b% e3 {& I& a
1 F2 B3 e' w. Q; G" n+ Z
void MCP4726_WriteData_Digital(u16 data) //12位数字量
0 x" z/ }' a g& p6 o
{
' u9 k4 p5 d1 M
u8 data_H=0,data_L=0;
$ V0 |3 L( D& e2 D& m h; |
data_H = ( 0x0F00 & data) >> 8;
/ p) X* o; [. H0 d
data_L = 0X00FF & data ;
# B, T. Z/ E. O- L9 X5 I
& t7 E% e! @/ \* i+ Y
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
- q8 ^ F! F1 b6 ~; d | V$ g; r$ I
/*起始位*/
% s' m* F% L8 d
I2C_GenerateSTART(I2C2, ENABLE);
. V8 e; Z- y6 v9 h
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
# Y1 d+ U" }* E$ u7 p3 p" n: G% t9 _
5 S# d6 K7 S: e8 I+ O. I! u; ~8 ]6 j# o4 ^
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
- j( l, q0 {. s+ ?8 E! |( f7 _9 M
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
) d. ^7 h! e. X% {7 J
/* Send data */
5 M. k6 Y2 L- b% B \4 t
I2C_SendData(I2C2, data_H);
( R' _+ M" F$ b: n
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
, U+ K: F J- L& b/ w" c
I2C_SendData(I2C2, data_L);
9 K% Q1 y; }' I" O0 H U! ~5 l
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
: q& F5 H/ z& l, P- c% i$ e
/*停止位*/
( g J T3 Z# Q' w X% Y
I2C_GenerateSTOP(I2C2, ENABLE);
! h$ a& c3 W8 S! y1 n4 E! Y
. L' T8 i9 L9 N' [
}
/ f8 U3 ]* r* K2 v
& l' m& J. ^( _ b8 x8 c1 e. N
void MCP4726_WriteData_Voltage(u16 Vout) //电压单位mV
3 r+ N! S) \+ d3 R! _
{
; y* _& P) D( L
u8 temp = 0;
8 E6 v2 D" n! h
u16 Dn = 0;
: d* W: J( e9 Y& d8 o' C0 l1 w3 s
Dn = ( 4096 * Vout) / 3300;
6 y! Y) L4 A$ t
temp = (0x0F00 & Dn) >> 8;
7 X7 s3 l0 _. l+ g( m
4 h/ y/ B0 w3 ~8 s
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
# J4 S' |( P/ }
/*起始位*/
6 C% z- r/ K5 l3 O2 Z
I2C_GenerateSTART(I2C2, ENABLE);
% Q8 h3 `" E- B
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
% v) K2 R) `9 ?3 i
; X+ q' k9 X4 J& ~7 F! t
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
) h, D" ]1 [, {$ m; y) T/ G$ `
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
; B0 ^. ]! N! y8 t% P
/* Send data */
9 J' I3 p7 J6 p8 j' O0 k
I2C_SendData(I2C2, temp);
9 X& g: P+ v! a6 Q
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
" R8 `( f; F7 O g* W5 _8 R
I2C_SendData(I2C2, Dn);
8 J8 J. _7 N1 E: v9 A F
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
$ b7 `. S% X. L$ t l
/*停止位*/
, w7 ~5 r. I; _# |7 s0 C$ H# f) W
I2C_GenerateSTOP(I2C2, ENABLE);
2 `# _9 R$ P, f( ~/ [/ Q
! Q0 e7 k, l4 u; j/ D% \
; L8 ?# A6 L( h v
}
复制代码
#include "main.h"
" }& \- t8 J& c6 @/ k$ d
8 V2 H; ^' K2 I2 {$ Y" `) F0 p
; [- ?. M. E) }3 l# H8 N/ Z4 \+ \
9 g w) S- u: n8 B# ?
/ V; C1 e8 X1 p- f" w
( N, R8 j/ P# w& \6 i0 M' a4 V5 W
int main(void)
a# K1 Q- w4 }3 w/ v4 }
{
1 n" E- q; s2 ]/ \9 s
" F! A; V# F( f. n
u16 i = 0;
% T0 n" Q% o3 j( V" C4 x
0 {; L: f( T% z2 y* Y* ?
Init_All_Periph();
5 N/ v. b# z1 | T) Q
& b/ v( r+ C6 k7 h4 n
USART1_Send_Byte(0xaa);
( q. p; N7 T2 f* h8 |
Delay_Ms(100);
1 X( _ `( ^, O
MCP4726_Writecmd(0x98); //设置命令
0 f) v8 S: `2 j7 V I) K
Delay_Ms(100);
6 R1 R1 Z# u( ?6 G
//MCP4726_WriteData_Voltage(1000);
; t# T' }& [% O( A6 @( a% r
while(1)
' D, C2 C, k0 d' u) x9 S
{
* i1 ~. s9 P {& d- ]$ E
//USART1_Send_Byte(0x55);
& ^3 d6 g/ d4 E, s" P+ @- L
for(i=100;i<=300;i++)
1 C0 P* i# I8 y \! T
{
6 J, O. v9 t: B2 X* M4 {1 L
MCP4726_WriteData_Voltage(i*2);
" `" x; O: v$ o$ G
}
( z- a r( y" j( I
// MCP4726_WriteData_Voltage(2000);
1 l' v8 U4 w! n& r$ N# _
// Delay_Ms(10);
3 W7 P5 Q S) ~) Y0 K
, |' W" ]. ] R0 y% E4 O
LED0 = ~LED0;LED1 = ~LED1;
: }, ^8 n' t" K2 H' p
//Delay_Ms(20) ;
- v4 y4 u5 A. w
3 D" S% Y6 p, ]4 _) f1 n
}
# J* u. A8 e- K/ _' C
}
复制代码
' A, l$ I5 J! S* ]5 F& h2 X& s7 _5 c
赞
0
收藏
1
评论
4
分享
发布时间:2018-1-18 09:08
举报
请先
登录
后回复
4个回答
七哥
回答时间:2018-1-18 15:59:53
a0a.1 32b0c
很好,多谢分享。
赞
评论
回复
支持
反对
zero99
回答时间:2018-2-1 09:28:17
a0a.1 32b0c
来晚了,感谢支持,已汇总到1月技术原创
% b4 ^( {( t: s
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html
赞
评论
回复
支持
反对
Galaxy_huai
回答时间:2019-6-16 21:42:21
a0a.1 32b0c
很好,多谢分享。
赞
评论
回复
支持
反对
Sunshine123580
回答时间:2024-3-12 22:03:42
a0a.1 32b0c
为什么我移植这个代码,不能实现连续的发送,只能输出我第一次发送的值?
赞
评论
回复
支持
反对
所属标签
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html
为什么我移植这个代码,不能实现连续的发送,只能输出我第一次发送的值?