你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32使用硬件IIC操作DAC芯片MCP4726输出锯齿波
[复制链接]
sxdahss
发布时间:2018-1-18 09:08
文章
文章封面:
-
文章简介:
-
本帖最后由 sxdahss 于 2018-1-18 09:38 编辑
8 e$ K0 ?) X- D
' G! [7 ^3 l% I
平台STM32F103,采用硬件IIC操作MCP4726芯片,IIC的速度设置在1.2M测试很稳定,MCP4726芯片手册介绍如下,并附上中文手册
MCP4726ä¸æ.pdf
(15.45 MB, 下载次数: 413)
2018-1-18 09:01 上传
点击文件名下载附件
6 v4 }$ z% m5 R2 B1 K( V
特性
* R* y7 c' ?( R& H
• 输出电压分辨率
5 _. P$ X4 c# n
- 12位: MCP4726
% |2 _/ h' d5 m& d
- 10位: MCP4716
0 A* b; y. i5 F3 F. S, M
, _" H" y0 p' }5 M! O8 p- Q
- 8位: MCP4706
3 E9 b; Z& t0 ^* ]) w
• 轨到轨输出
l, M; }" [% s# l- q5 L1 Z: T
• 快速稳定时间:6 μs (典型值)
# {6 y$ H5 z* `5 H l1 g- e' y0 N+ j
• DAC 电压基准选项
8 \- o3 s7 {' K; N5 I+ k7 h
- VDD
" f! C+ H6 R3 X/ B' A8 M9 \
- VREF 引脚
+ @4 m7 A- H: t2 w, m8 m1 j( M5 @
• 输出增益选项
* J" i9 j9 l. G! F, ~) G
- 单位增益(1x)
: f9 `& V/ h% n+ I- t! [
- 2x(仅在VREF 引脚用作电压源时)
( c2 g) Q% S) a* h% M2 h& Q
• 非易失性存储器(EEPROM)
5 a! I3 m( }4 X1 v" g
- 自动重新调用已保存的DAC 寄存器设置
8 c* I; r' G& a- E# ]
- 自动重新调用已保存的器件配置(电压基准、
$ ?/ Y$ u$ c) Z9 O! a
增益和掉电配置)
6 K b7 K) M+ P6 M/ L
• 掉电模式
# ]; v+ O$ F& f" t
- 断开输出缓冲器
% u7 r/ V2 h) m# g2 Z% I
- VOUT下拉电阻选择(640 kΩ、125 kΩ或1 kΩ)
+ b5 K/ R2 {: A6 i, _" F' I
• 低功耗
. A1 ^# b& j* X k& D
- 正常工作:210 μA (典型值)
+ F5 {0 G& n. i [1 r$ `# ^
- 掉电工作:60 nA (典型值)
. r. u# Q# V* P. g+ b: X
(PD1
D0 = 11)
+ P/ o' T# C6 e0 I2 L
• 单电源工作:2.7V 至5.5V
( J `) w* Y0 y$ ~0 s
• I2C™ 接口:
5 B- O) @# {- h
- 8个可用地址
% J+ K1 l6 L6 t# P: X( c a' m( e
- 标准(100 kbps)、快速(400 kbps)和高速
- z- e* q( l( a6 T& \1 u: x$ n
(3.4 Mbps)模式
+ c) M+ j; [ U4 G: c
• 小型6 引脚SOT-23 和DFN (2x2)封装
* ?9 m) j. m6 X' J/ O2 Y; t
• 扩展级温度范围:-40°C 至+125°C
; B+ K6 N' m% g4 N: D( T& C
#include "mcp4726.h"
5 c, G8 _: c% J7 j/ V" x" D* u) e5 L
3 k3 X5 _: M, ^
; n5 H" V/ [7 F% S9 Z- l
/* 命令位 VREF1 VREF0 PD1 PD0 G
+ w6 u2 M5 h7 i5 ]" N2 F" V" w
1.命令位 //MCP47X6 支持的命令
+ f1 X% j# f6 ~$ R3 k' N8 t& o
C2 C1 C0
" b. a' r% t9 h
0 0 x 写易失性DAC 寄存器命令
$ e3 N2 E- G* D6 \
0 1 0 写易失性存储器命令
9 n# m+ b' w4 x) ^- h: V3 n
0 1 1 写所有存储器命令
9 m1 Y- B7 g- B& o
1 0 0 写易失性配置位命令
! }# f7 g! ]& R4 c3 e
f5 f. ` U6 T, N/ Z
2.VREF1 VREF0 梯形电阻网络电压基准(VRL)选择位
7 [2 Q& }1 R/ B. }- o! O
0 x VDD 无缓冲
1 O( \: G9 T( ^" o' Z0 j
1 0 VREF引脚 无缓冲
4 `' s" \6 P/ A
1 1 VREF引脚 缓冲
# {8 O5 ]8 `2 m1 v
3.PD1 PD0
$ ]0 \) g) q- d2 ?0 i
0 0 正常工作
, O8 i0 v+ {- G- [7 ]
0 1 1KΩ电阻接地
7 G) J1 d4 o3 k' O$ x
1 0 125KΩ电阻接地
o% p; B* l% @
1 1 640KΩ电阻接地
3 T1 m$ l* N& x# F0 h2 Q
4.G 增益选择位
# H& o& w% J# q4 E5 A1 S3 E
0 =1x (增益为1)
" v9 u! x$ J# r! N
1 =2x (增益为2) VDD作VRL不适用
- O; R; D, B& H; m; O* X
*/
9 I2 p! Y4 s2 Q* q) G e
// C2 C1 C0 VREF1 VREF0 PD1 PD0 G
7 F* x% y) l$ @4 c0 @* Z/ A# ~
// 1 0 0 1 1 0 0 0 0x98 写易失性配置位命令
" J& H) J2 Z- ~' n
8 f) P+ w+ F8 l) h1 E4 h6 Y9 F1 P
//写配置
# n+ ]3 j8 j/ w! T$ o5 b, n
void MCP4726_Writecmd(u16 data)
. g# u8 q- _5 F1 E" c
{
" [' }. [7 O; o4 {
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
/ {& n+ M1 @3 n0 W9 U$ |
/*起始位*/
) K+ [: z! p. u/ {4 P! h
I2C_GenerateSTART(I2C2, ENABLE);
6 h5 K% L7 C! K6 R- ^
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
& z, m5 k4 i2 u% I& W' a: G
v' l/ B; I/ I& ~$ {
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
1 t: z9 @& |2 M" e0 R
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
8 m% g9 n: \- i& j0 l+ f. P
/* Send data */
3 }% F1 `, G: ~1 l4 Z9 J L& h
I2C_SendData(I2C2, data);
- n* p' {& b7 y! i# Z2 B
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
G* y6 c/ Q0 @( L' P- t1 w
/*停止位*/
( o- `' v+ n; d E% T# `
I2C_GenerateSTOP(I2C2, ENABLE);
# S% ]2 Q+ ~0 j4 F: @9 y& c! w( M- c
' i" H" ^7 f6 u" }
}
$ G. Y! ^2 X* k
3 z5 e: [1 o# j1 Z
6 W) [) C. N- w5 s- M
void MCP4726_WriteData_Digital(u16 data) //12位数字量
, I0 V; @( X% x: b# u9 D8 R7 o: x& I5 P
{
& P( q* e! y _6 g/ m% y% q: W& D
u8 data_H=0,data_L=0;
& n+ y8 l _" D5 P, U( w9 z8 N3 d F# Q
data_H = ( 0x0F00 & data) >> 8;
) Y2 Q5 b) g* m5 t, ?
data_L = 0X00FF & data ;
+ K; y* b- h. C* _& L
5 w. m8 X4 W, n$ @$ m
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
! K' ]8 _8 g( N. j
/*起始位*/
4 h$ M$ T: e( Y; f! j8 ]- `- @
I2C_GenerateSTART(I2C2, ENABLE);
% a2 S8 s( a7 |8 V
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
3 ?% U. G* h5 D* S, s/ H, e
j% s8 J A+ j$ I2 k
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
: b* H$ m: s% n( S4 p
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
! |& ~0 ?! T1 `3 ]" A2 D- C7 { ~! Y
/* Send data */
* z+ ]* s( [ H* X* N; p
I2C_SendData(I2C2, data_H);
' K5 z- D A9 t# \1 F8 V. f: C
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
7 M- T* t1 q0 C3 S! t
I2C_SendData(I2C2, data_L);
$ O; F5 E% \- |/ {( _8 w; D/ W
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
4 F" I& M2 `+ |
/*停止位*/
. s. y* F& N2 U
I2C_GenerateSTOP(I2C2, ENABLE);
$ A+ `; }1 }, G5 D6 E# X' g" O: r
' f% X7 S* b5 N3 O9 a ^5 F
}
2 \5 [) j/ ~% r2 I p
) {5 p; T; Y' {. t7 ~
void MCP4726_WriteData_Voltage(u16 Vout) //电压单位mV
+ h0 ^3 V. t% W
{
% J( ^+ T! f0 O: ?9 p, ]1 m
u8 temp = 0;
7 v; P5 P% e. `7 {$ z' R. n
u16 Dn = 0;
7 q; E r: w3 q
Dn = ( 4096 * Vout) / 3300;
: C- e0 V& N1 J$ ?1 \
temp = (0x0F00 & Dn) >> 8;
2 k8 x3 O$ C8 o
^( c5 Y+ S" y3 w
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
: n$ J7 s& B0 D/ P
/*起始位*/
2 U. C) N1 t0 {. Q
I2C_GenerateSTART(I2C2, ENABLE);
. ~) ]! L7 |; f
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
% e) H7 W" ~+ q1 C7 u
$ W$ W1 d" u% W) j6 b
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
& H* F( Q; t u! q' j
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
6 K/ g% q4 v! K; s6 n+ e
/* Send data */
! g; o0 r. v0 ~; @4 k) T$ `4 ^% | c$ j
I2C_SendData(I2C2, temp);
' D0 f6 A* a7 M2 f, j2 |2 m
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
V+ g; m+ h5 [; Z5 A
I2C_SendData(I2C2, Dn);
3 l2 u! w$ |: }! W3 i$ ~+ y% r
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
5 t1 J7 q9 p5 Y0 v- K
/*停止位*/
& x1 Z2 S4 b3 r+ M& d# k4 P! g$ S; M
I2C_GenerateSTOP(I2C2, ENABLE);
, J$ {8 M5 X$ |1 n$ K
' q$ h0 [2 [5 ^% A, \7 N% k; `
! U. m; w4 N# g8 Z' p& z
}
复制代码
#include "main.h"
- U: e( t6 b# L8 A7 _4 ]# I6 x" |
! T& u$ b$ p8 l" j& b
& r# K6 A( f/ Y4 D
' @) b6 n% \$ M1 M) J+ Q% D, P
$ f& C9 M& z' n: r
+ S! a; [$ x! ~
int main(void)
( S4 F0 ?' N6 C9 m9 b3 u' }" t
{
2 ]; ], @2 ~- Y/ G7 }6 d' @6 [
. ~# ?1 @) t# N, \
u16 i = 0;
7 g3 _# J/ h$ r w% A0 |
! O. D- t9 b6 ~: f: I0 K
Init_All_Periph();
3 ~0 a4 w, j* `' S
4 Z! a$ m5 F7 b( k% g# z6 F
USART1_Send_Byte(0xaa);
4 C3 t; S E" [/ p7 ?" C
Delay_Ms(100);
/ ^! G8 Q( Q9 f2 y* R$ O8 E
MCP4726_Writecmd(0x98); //设置命令
/ n9 l) t4 Z; x" e5 x7 ]" I
Delay_Ms(100);
2 @' Y- j$ r1 r+ X/ i. w% n# @
//MCP4726_WriteData_Voltage(1000);
# ^ V8 z" Y* H( A6 k0 M4 I: ]
while(1)
+ G3 G1 `5 p7 C8 o' J, r
{
, ]5 G% u& ~( k5 r# G# Y% U( U* K
//USART1_Send_Byte(0x55);
' S! \5 i* q) E
for(i=100;i<=300;i++)
. v0 C3 Z3 ^" p% b
{
6 ?4 r( f; d. R. r7 k
MCP4726_WriteData_Voltage(i*2);
) l, O$ j# G' _3 v
}
8 S n$ c& T3 E# c3 q2 `
// MCP4726_WriteData_Voltage(2000);
* G2 Q' L8 E& S; x$ o/ |- B
// Delay_Ms(10);
3 c/ ^7 E( [& ~* l+ B* W
; c; Q5 }! m5 H4 w7 r
LED0 = ~LED0;LED1 = ~LED1;
& s5 |/ Q' b2 B" d: L
//Delay_Ms(20) ;
) l1 b; q; t! R2 D6 w* x
# D, S1 Z0 R: }# y
}
1 ~, z$ \( w/ U8 h
}
复制代码
# ^1 F2 l. E% p! v9 G6 f; v
赞
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月技术原创
3 u/ d$ x8 j- e
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管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html
为什么我移植这个代码,不能实现连续的发送,只能输出我第一次发送的值?