你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32使用硬件IIC操作DAC芯片MCP4726输出锯齿波
[复制链接]
sxdahss
发布时间:2018-1-18 09:08
文章
文章封面:
-
文章简介:
-
本帖最后由 sxdahss 于 2018-1-18 09:38 编辑
" o4 Z; N! K5 A
% y! H' ]% O0 u- z
平台STM32F103,采用硬件IIC操作MCP4726芯片,IIC的速度设置在1.2M测试很稳定,MCP4726芯片手册介绍如下,并附上中文手册
MCP4726ä¸æ.pdf
(15.45 MB, 下载次数: 413)
2018-1-18 09:01 上传
点击文件名下载附件
, b' E5 b1 a9 Z H1 i- F* ~
特性
: I: i4 \' x% p0 V, v$ T. H: ]* `0 r! u
• 输出电压分辨率
1 l. M& `/ c2 }& t4 e
- 12位: MCP4726
4 C5 l/ \9 [" i! c
- 10位: MCP4716
8 U, M4 ?) }6 m: i; o; k; L8 b
: @9 C2 b1 H" V, w- A
- 8位: MCP4706
3 P+ F! ?1 n1 S8 s* x; n D$ {
• 轨到轨输出
! \$ J0 x3 ]2 O
• 快速稳定时间:6 μs (典型值)
- B. ~- u. a0 H t
• DAC 电压基准选项
4 G* N$ g* i0 e* N! ~
- VDD
8 a! J+ W$ X0 K. S8 ^6 _+ o
- VREF 引脚
& A3 j5 G- r' K2 X
• 输出增益选项
' }2 }7 s C6 B: H
- 单位增益(1x)
2 _8 k+ F# f8 C
- 2x(仅在VREF 引脚用作电压源时)
3 v% z2 D. o8 ]4 x0 z8 n1 {
• 非易失性存储器(EEPROM)
5 j a$ \9 I; U: z* h2 G$ J
- 自动重新调用已保存的DAC 寄存器设置
5 _7 F( l) Z" E7 L7 T. n" A
- 自动重新调用已保存的器件配置(电压基准、
) g3 i. n! J: e. X
增益和掉电配置)
) a) R: S/ l$ r# j' O/ C
• 掉电模式
1 y# h( v: ~# n+ w. H% T
- 断开输出缓冲器
l f# N) G: V0 L; t* a; C4 |
- VOUT下拉电阻选择(640 kΩ、125 kΩ或1 kΩ)
$ \$ X1 ]) R8 T/ {* B# t
• 低功耗
$ M+ K8 V+ D' c, J' c
- 正常工作:210 μA (典型值)
0 h: z1 E( K0 r! M0 o+ M; r
- 掉电工作:60 nA (典型值)
$ M$ F0 h1 J0 T Z
(PD1
D0 = 11)
9 t4 s g1 e# v2 m1 D3 h
• 单电源工作:2.7V 至5.5V
% V3 v* i4 G# g0 N; X P4 ]0 j
• I2C™ 接口:
! l) y; N1 S# M6 v/ a8 V
- 8个可用地址
# J. |1 T3 S: u, ?0 u( r
- 标准(100 kbps)、快速(400 kbps)和高速
# k% B- @- e2 F, r+ O
(3.4 Mbps)模式
% r% D" F* x. o8 D2 o
• 小型6 引脚SOT-23 和DFN (2x2)封装
6 i( Q6 z9 Q2 j9 I! L6 p" z" F
• 扩展级温度范围:-40°C 至+125°C
! S2 C) A4 `/ A% P' A
#include "mcp4726.h"
. m! o" `+ \: o& {- S1 X) U5 B
" H6 p; [1 ]6 c2 K
0 S3 E6 f& n2 }) V
/* 命令位 VREF1 VREF0 PD1 PD0 G
5 ^+ U B/ F/ [$ v
1.命令位 //MCP47X6 支持的命令
3 ]6 V0 o# l( V/ r( B
C2 C1 C0
( I* H5 ~7 G: E* ?2 S
0 0 x 写易失性DAC 寄存器命令
' K1 j5 ]: D9 P* u" R
0 1 0 写易失性存储器命令
5 `+ \$ t9 Y9 f
0 1 1 写所有存储器命令
; c$ J/ B5 G* B
1 0 0 写易失性配置位命令
1 f) [. o7 @7 ?! v; C! z6 a+ P! y$ Y
) }- |" ]% W5 }! G/ M) @
2.VREF1 VREF0 梯形电阻网络电压基准(VRL)选择位
% m# ^5 l+ d" a, W$ o1 t
0 x VDD 无缓冲
/ c0 u# T. f$ e1 L! w+ Q0 ~
1 0 VREF引脚 无缓冲
8 [1 E/ B4 B: i; a' m% ]5 }1 N
1 1 VREF引脚 缓冲
$ m7 l! B2 S r0 U3 W6 X8 R2 [
3.PD1 PD0
% ]; d( \6 c, @, v
0 0 正常工作
3 @) i G6 e( U0 C \, z6 b1 o
0 1 1KΩ电阻接地
8 C7 g# S3 F( U$ y; g5 G
1 0 125KΩ电阻接地
7 c$ l, r% K: s2 S
1 1 640KΩ电阻接地
9 p u" w# d; h" n5 |
4.G 增益选择位
/ k' G( m) ?; V( l5 r7 m' e! k
0 =1x (增益为1)
/ i3 o, u; n2 X$ c9 O& d
1 =2x (增益为2) VDD作VRL不适用
, D) I$ Q8 N( C8 r y
*/
- Q! q$ G% r" D: }9 c) N3 W+ F
// C2 C1 C0 VREF1 VREF0 PD1 PD0 G
0 s& g' G9 G; V' v, K8 R$ M7 o
// 1 0 0 1 1 0 0 0 0x98 写易失性配置位命令
8 Z6 W) S0 e5 ]2 c( _' v
8 I1 D2 I' ]' S+ e2 Q
//写配置
. Q0 E3 m5 \8 _4 I
void MCP4726_Writecmd(u16 data)
: R% U& L1 K# V" u, A
{
, V/ ? O* X0 F# y8 j, t1 _* v* K
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
, _; P0 J1 _% @7 I) I' m
/*起始位*/
/ p/ d; Q5 C h+ n6 o2 P
I2C_GenerateSTART(I2C2, ENABLE);
+ i$ A* H2 n& t- X
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
: A3 C" S" Z& z/ W' J4 V/ X8 K( B
& N4 G8 g' m2 ~' q( b' `* F
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
+ }; r' k) j. N8 _! [% a
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
' Q3 D0 `! _9 ?& c* P1 L
/* Send data */
$ G! E7 V6 H! l
I2C_SendData(I2C2, data);
9 h& E n) [ W: E
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
. ^' v8 y" W. w0 T" t
/*停止位*/
/ k4 u9 h: i# a2 Q+ {/ z3 Z
I2C_GenerateSTOP(I2C2, ENABLE);
9 _! u' u$ h+ _
0 |% g D/ X5 R
}
; E3 F6 n7 L) \
3 a: ^* y( S( L& a8 G% C
& c+ W: ^/ Y" ?
void MCP4726_WriteData_Digital(u16 data) //12位数字量
8 b! \, N$ I8 J6 U& y
{
9 _8 s3 C; ^# `0 C0 i$ e8 R
u8 data_H=0,data_L=0;
: f( }: Z; j; F. p6 n/ d0 Z7 x
data_H = ( 0x0F00 & data) >> 8;
d! _% k y+ K% E0 F* p: S$ r
data_L = 0X00FF & data ;
" Y( a% _! O4 n3 R( \4 U6 I
2 J9 g; g# I8 b; k Q4 t
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
9 v% ?4 L; @7 z" }' O+ k
/*起始位*/
% n" o6 h; [$ e3 ?. N
I2C_GenerateSTART(I2C2, ENABLE);
) t) \% d) [" F6 A, V8 k
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
( H/ X j# a; |4 T; S q
+ }) q+ W7 ?5 ^0 S6 p. p; o4 B
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
( ~. U) h0 [0 C) v% @; b8 N5 O
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
N6 F3 Z) N9 ^: J k
/* Send data */
2 w4 X2 a/ G# M
I2C_SendData(I2C2, data_H);
1 r% f" C' G/ T- A7 |; G" z$ z5 \
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
7 H+ p9 L9 x3 G) B. d5 o) r& Z) U
I2C_SendData(I2C2, data_L);
) \+ ~) n# N8 V5 @& t O
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
. V* v. c% @. B+ i
/*停止位*/
+ p- a" _$ b- G# h
I2C_GenerateSTOP(I2C2, ENABLE);
+ L2 W7 p9 k( K* S0 L
; a. q0 X1 n/ g9 Z4 N
}
: g; R# ~; m# x0 ?4 B# Z
. |/ w4 Y! ~! S$ A& I/ `9 D0 [. i- B
void MCP4726_WriteData_Voltage(u16 Vout) //电压单位mV
5 S+ t( ^& x2 K1 c( X9 c$ c/ B
{
$ _4 U1 \: Y) v4 N6 \7 `) ?
u8 temp = 0;
8 V) D6 }# |; U* h% L. k' u/ W
u16 Dn = 0;
9 b8 K* v5 \* T5 E
Dn = ( 4096 * Vout) / 3300;
% i- x( N0 h" c$ L
temp = (0x0F00 & Dn) >> 8;
0 c) C4 v. v0 F8 Z9 Y: A8 a* f( \
8 I. j& ?0 f: \* C) c; L v' C
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
8 R/ [7 Y9 K: R& e8 f0 z
/*起始位*/
- Z- F) y8 d8 ~' o( ?
I2C_GenerateSTART(I2C2, ENABLE);
D4 X, n8 [- ~1 Y3 m* \( k. k
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
# @ @# c2 o2 Q: J
U& _( K, T! a
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
& u* V L( d% r m+ V7 M
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
2 X8 g# m* ?- x( U, t
/* Send data */
3 p: a' J4 q. f% Q. E. ?- ^" x
I2C_SendData(I2C2, temp);
; P# `' a* x) s' ^ I
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- V9 p# N8 T& y
I2C_SendData(I2C2, Dn);
3 ^* u9 K- b0 ]3 m9 T2 l- T3 \5 |
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
+ l( ~6 T, p0 ^0 C
/*停止位*/
5 }: W7 N; I; [+ m. X; w
I2C_GenerateSTOP(I2C2, ENABLE);
' O6 R7 n- V) n) o# X0 o2 j
" Q: I9 u! `5 a, m
+ q8 e) e( S/ M, x: D% I! F
}
复制代码
#include "main.h"
6 v8 o$ V L/ h
. i9 m8 N. a* a2 r: K
- I' w1 C8 Z# K/ J/ R8 V
( X' I- |/ v: z: O; h! e% p+ i
* f9 i, q2 {7 P8 d+ M' r2 \! q
3 d" Z9 t! ^$ I
int main(void)
p5 f' @% a6 @
{
1 X5 a2 v6 w/ h7 V. X' a
4 p, }$ D3 x3 w" L- ~3 p+ F
u16 i = 0;
: v2 A" c% B. w% Z
# _) t' |# b" H! V% i2 E6 U
Init_All_Periph();
$ G* C4 W! X9 x* k1 P& H. A
; o: B3 Z' x. [0 M/ m' W3 ?% \
USART1_Send_Byte(0xaa);
7 ? x- u2 l* p; Y# C+ I
Delay_Ms(100);
8 J9 I, Y+ I8 M0 u# K0 p5 ^
MCP4726_Writecmd(0x98); //设置命令
& V6 j% ]: A6 S! m P
Delay_Ms(100);
% t8 s e6 U7 p+ a
//MCP4726_WriteData_Voltage(1000);
1 c1 y4 y; ?/ B( ]: ?$ U" g) n. X9 b
while(1)
. {3 n4 S* d0 C
{
( b- z& u2 Y m! U1 t& t
//USART1_Send_Byte(0x55);
( h/ x0 K" Z2 W1 O }3 B) f9 R
for(i=100;i<=300;i++)
! x# X6 Y6 l$ b S; }
{
' Q6 }! k7 |$ t. L% U
MCP4726_WriteData_Voltage(i*2);
+ H, _; T* b7 }2 {! ^$ G0 F
}
* G( f' ~& S* r' `, u0 W- H
// MCP4726_WriteData_Voltage(2000);
, ^5 T6 R' Z9 K
// Delay_Ms(10);
/ L4 U& Q; s0 a! B$ o
: S" e; d& M2 l. f$ w' s# K
LED0 = ~LED0;LED1 = ~LED1;
) n& }! T* `! d4 L8 E
//Delay_Ms(20) ;
: U/ e5 O8 K8 r. ?+ [$ X- ^; X
4 j2 ~. o/ I/ S" g$ _2 u
}
$ R) X3 ~0 D8 ?5 c5 }
}
复制代码
7 s3 [( F Q, A6 ^) Y" T3 N. H
赞
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月技术原创
) f& d; T, q) d$ G0 x
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
为什么我移植这个代码,不能实现连续的发送,只能输出我第一次发送的值?