你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32使用硬件IIC操作DAC芯片MCP4726输出锯齿波
[复制链接]
sxdahss
发布时间:2018-1-18 09:08
文章
文章封面:
-
文章简介:
-
本帖最后由 sxdahss 于 2018-1-18 09:38 编辑
0 D2 G% ^& Q% z2 Y. g
, p- o) l( H" C: E3 G. e1 K, V6 p
平台STM32F103,采用硬件IIC操作MCP4726芯片,IIC的速度设置在1.2M测试很稳定,MCP4726芯片手册介绍如下,并附上中文手册
MCP4726ä¸æ.pdf
(15.45 MB, 下载次数: 416)
2018-1-18 09:01 上传
点击文件名下载附件
6 o4 ?7 n7 L) W- d' \. c
特性
# M2 \0 Q' h. S$ l8 y
• 输出电压分辨率
9 I# Q: I; d( Z( _/ n! e. a# J8 O
- 12位: MCP4726
+ L1 n' v7 [. r
- 10位: MCP4716
0 \% @' P& O. Y( {0 C
- @. d4 s7 J' e5 \
- 8位: MCP4706
9 S; V3 \3 f: Z
• 轨到轨输出
: F2 L7 ]( _7 n9 }: V
• 快速稳定时间:6 μs (典型值)
3 g# _& T' [" M' C% }- L7 t
• DAC 电压基准选项
/ M9 H) \* {5 a
- VDD
1 s. ^% C6 X# t# ^- U: l9 v5 a
- VREF 引脚
$ E3 W4 J8 n+ h/ D
• 输出增益选项
" w4 Y: [" Z- {" q" Q2 F: G& B
- 单位增益(1x)
+ X& Y( u, m0 p% U9 |
- 2x(仅在VREF 引脚用作电压源时)
/ [( k2 [* j# V5 }0 u# n; F
• 非易失性存储器(EEPROM)
' O( ^- ]9 Y# V' {' a* U( b
- 自动重新调用已保存的DAC 寄存器设置
( h, \. M' y5 x9 u8 ~/ ^& X
- 自动重新调用已保存的器件配置(电压基准、
. L4 A, Y, ~, t( Y
增益和掉电配置)
, C' z2 D! X+ q) P0 B
• 掉电模式
, n' T" N$ i$ R% F, [$ Q+ D
- 断开输出缓冲器
$ @; r) D( p' Y0 p
- VOUT下拉电阻选择(640 kΩ、125 kΩ或1 kΩ)
; L9 V+ n, t: c7 g% r# f, D
• 低功耗
7 [! j# O J# \. V/ ?; h9 d
- 正常工作:210 μA (典型值)
4 d7 K7 B: Q7 L6 }
- 掉电工作:60 nA (典型值)
# Z3 s' x8 s: K4 o- p% N) s
(PD1
D0 = 11)
' E: G' s9 ?: j T
• 单电源工作:2.7V 至5.5V
8 k$ O& Z+ b2 C7 ^9 X3 m
• I2C™ 接口:
& w4 t- `" `" Z6 u7 M. j) D( w' e
- 8个可用地址
/ Y- J" ?( j! ]
- 标准(100 kbps)、快速(400 kbps)和高速
" q6 M. u& u) B* z3 [
(3.4 Mbps)模式
- m7 d( @4 G" l' ]) ]- c
• 小型6 引脚SOT-23 和DFN (2x2)封装
, a) E5 Q) L' o/ @4 F
• 扩展级温度范围:-40°C 至+125°C
# I: s5 i6 Z; ~, K) T
#include "mcp4726.h"
, k1 I. ~+ X+ }' D5 L
/ Q1 v3 o W: X9 b1 e! @
2 b) ?5 R& X) G5 B" W2 d
/* 命令位 VREF1 VREF0 PD1 PD0 G
; y8 I4 z% |* s9 ]/ x, n
1.命令位 //MCP47X6 支持的命令
. D- |3 Q I) F, J0 s/ l3 W h- Q
C2 C1 C0
# K7 z, ^0 a6 S8 V, p6 f
0 0 x 写易失性DAC 寄存器命令
6 x7 Y4 h+ c2 `% o4 q" W
0 1 0 写易失性存储器命令
. ^- f" j" x2 h* z" m1 J
0 1 1 写所有存储器命令
9 _4 Y& H& e2 R1 j/ l( j/ _
1 0 0 写易失性配置位命令
! G, i2 Z; A, C% m8 y6 r
$ n# F$ `/ ~) a( k8 [$ g. _/ f5 s2 o
2.VREF1 VREF0 梯形电阻网络电压基准(VRL)选择位
5 a' h; ^9 D% r& M& M
0 x VDD 无缓冲
3 G h6 L: k; v0 ^4 G1 x# ~) h- \
1 0 VREF引脚 无缓冲
, n9 B' B+ y# Z8 e6 I( c+ d
1 1 VREF引脚 缓冲
. L) K# q5 J, {0 _. X" i
3.PD1 PD0
. Q) |" o- e6 h" X, B2 c7 H
0 0 正常工作
; y' G* z I' I: W; W! b
0 1 1KΩ电阻接地
8 F" v h* H4 c4 }( t
1 0 125KΩ电阻接地
5 ]1 w k. a4 d! |: F* Z
1 1 640KΩ电阻接地
4 ]- J, |- [$ X) X2 A. `
4.G 增益选择位
& W2 K8 b- f$ R
0 =1x (增益为1)
; A9 J5 v+ H0 D: p3 Q" t
1 =2x (增益为2) VDD作VRL不适用
7 ]' ^! Z |# ^( V
*/
2 q! g% S1 h! e Y3 j' f9 x/ s" N
// C2 C1 C0 VREF1 VREF0 PD1 PD0 G
. n* z" p' H' w. q- c( A; G( ]& q
// 1 0 0 1 1 0 0 0 0x98 写易失性配置位命令
2 o+ O6 k: l" }( O$ I# Q$ v0 S! c
4 s$ E& }: V# k& c
//写配置
* B) J# x2 G, N& d P( G
void MCP4726_Writecmd(u16 data)
5 ]; C* n- `6 b$ {0 Z% \+ X! D
{
: X f3 E6 N. T0 k v
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
1 ~" l- F/ U% G* E& W0 J
/*起始位*/
" v& R, e9 w4 l- j
I2C_GenerateSTART(I2C2, ENABLE);
! ^& e' F+ Q S
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
5 q' |" R1 u* Z* D% x% w0 j
+ c3 z9 j; @4 S4 g% R* L6 N
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
7 w" U! _ e) M
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/ W- J& E9 N: T& y
/* Send data */
# B$ U, Q5 q+ o- o9 c
I2C_SendData(I2C2, data);
$ D6 v' G0 R& W. U* w! o
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
( [0 E* m( \) h4 p: y1 L6 j- ]7 }
/*停止位*/
7 T! u4 {9 U3 ^4 `/ L
I2C_GenerateSTOP(I2C2, ENABLE);
: p6 k- K8 k% T% H6 m$ ?- Z- l
4 f" H5 L. \& [9 e% }
}
' K) b$ ?0 ~( C y; X! c" f% e
7 T/ A6 N3 Q4 R
& G6 c+ g8 U1 v- e
void MCP4726_WriteData_Digital(u16 data) //12位数字量
x3 M# z4 T, m" h0 s7 X1 Z
{
4 O$ O5 q- ~9 q* ^& [
u8 data_H=0,data_L=0;
; m6 P' T: ~2 d$ x$ x
data_H = ( 0x0F00 & data) >> 8;
0 B; l/ u/ ^+ P: v% S
data_L = 0X00FF & data ;
F- L3 y, a8 _( V
4 w) ?5 R' v, q7 R
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
" m" R5 j& S4 I) A" b* t
/*起始位*/
* w2 r5 ]7 D" Z2 `! u- F. ]7 z
I2C_GenerateSTART(I2C2, ENABLE);
8 n' o) `9 u, y: V6 z1 y4 U$ D) t
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
! L! v# i1 V* u/ E4 g7 }
; F4 l2 x3 t5 ]: Z
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
7 j$ f& d& k4 x/ R+ ?' K
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
+ }2 | A4 h4 E2 n
/* Send data */
) D2 g. x7 M- j7 W
I2C_SendData(I2C2, data_H);
t* ]* ^. k6 ~2 _4 A: A+ y
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
3 p7 Y4 @* h+ \; t5 S5 H: Y9 v1 c" @9 J
I2C_SendData(I2C2, data_L);
6 A+ B" f1 @. N6 D# P
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
5 r3 O) }6 I3 {3 J) _) _+ Y
/*停止位*/
$ A9 y/ _6 S8 C5 X# I
I2C_GenerateSTOP(I2C2, ENABLE);
1 B. S- \" J3 x' S! {; L1 v
" h9 O! t6 v* J' \, }
}
. S/ h5 G" }( f
- @0 y3 e7 T7 i6 _: g0 ?: D
void MCP4726_WriteData_Voltage(u16 Vout) //电压单位mV
( W% F! E" x. r7 S" u0 }* D
{
/ C& k% g9 h$ B( }2 `
u8 temp = 0;
; r' m+ @# } L3 F' I
u16 Dn = 0;
7 Q1 |; B) w5 [
Dn = ( 4096 * Vout) / 3300;
2 c1 O9 k1 L$ J) t
temp = (0x0F00 & Dn) >> 8;
A6 W: u5 I9 b, r) v
0 e, U6 |$ O. T. H; k% w% s
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
8 ]( @ o7 d% m! i/ a5 {
/*起始位*/
: x& I1 q, b- h$ {5 _
I2C_GenerateSTART(I2C2, ENABLE);
7 B, M! f+ j- c5 _: i
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
: ?# b& r! {$ z. N5 ]
- K2 C) H0 ^0 t
I2C_Send7bitAddress(I2C2, MCP4726_ADDR, I2C_Direction_Transmitter); //设置MCP4726设备地址 0xc0 写,0xc1 读
$ t+ l' D/ W3 E
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
. ^6 K7 N- H$ }$ g) l1 W3 @& V
/* Send data */
6 G) S" n3 S% {( ?7 Y1 C+ P
I2C_SendData(I2C2, temp);
: {; J8 J' a9 |5 ]$ Q
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
, r, I9 C9 A: z7 K: y
I2C_SendData(I2C2, Dn);
6 R" d' C x& V
while(! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
2 B) y" _7 O' x h) ^. v1 u6 V+ V
/*停止位*/
8 l& T: P8 n7 {) B; h* y4 ]; @! \" K
I2C_GenerateSTOP(I2C2, ENABLE);
( v5 a0 f, w; `8 S4 v
( j* o; [; m0 }4 L
& I% E, n$ O% }3 D* v, [8 t; b
}
复制代码
#include "main.h"
0 \' ^! \' @' n8 j, k3 D* ^
' W$ t, @ }3 u2 F
1 n6 g- h" y/ ~; B% r/ @
. S& w+ {( m J% w. g; n% G0 L: A
+ a* A7 H1 w9 w" k% P* \: ^
) |1 [5 T* q+ v" }+ X" h* ~. S
int main(void)
8 I( Y. \; T& O8 R- S; ]8 U& O
{
+ g1 v+ m4 ]& _& m( G" x" L
' z& ^) g7 ~( D" i) C
u16 i = 0;
3 Y, J3 @# R. f' y( P: I
- e3 a7 S2 X5 t! H" ~7 H
Init_All_Periph();
, {% ]8 g8 o) l1 x9 ?
' b5 O- E: d2 H$ O$ A' V) ]
USART1_Send_Byte(0xaa);
A+ @! T- U$ R3 b: Z: L
Delay_Ms(100);
* B8 A* O3 b% E( x* u9 a3 c! q
MCP4726_Writecmd(0x98); //设置命令
# W2 D0 q+ d6 B
Delay_Ms(100);
0 E9 } G6 o7 Z& z
//MCP4726_WriteData_Voltage(1000);
" n6 @; |+ f( j# O, Z, i
while(1)
" A# C- v* u4 L% s
{
0 g4 F1 p3 A/ |2 F; E/ d' O" G
//USART1_Send_Byte(0x55);
) K/ t) L4 ^ h! p8 d2 \
for(i=100;i<=300;i++)
- [0 `4 A$ q2 {( g
{
" C' ?! V7 ?/ f6 @. O
MCP4726_WriteData_Voltage(i*2);
) G) y y7 G2 B& g" y
}
) r6 u3 z6 f5 ~, Z2 C" ^) v
// MCP4726_WriteData_Voltage(2000);
; O- z$ V/ z' m' C9 C+ C3 W% R
// Delay_Ms(10);
3 Y. Z) E1 k( z0 {
5 ~7 R: `; R# v3 R) e7 h
LED0 = ~LED0;LED1 = ~LED1;
7 G3 L T/ B: \/ w e* ?- {- ?4 I
//Delay_Ms(20) ;
, J) ~ k. ~5 d9 K/ A+ p2 g
5 Y% x( n2 D* A; ^
}
& T8 a: X+ i! g* h+ V. }
}
复制代码
% H8 w2 C V* e$ s1 T6 a- Z8 X( x
赞
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月技术原创
t/ n2 x W+ v% B
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
为什么我移植这个代码,不能实现连续的发送,只能输出我第一次发送的值?