STMCU小助手
发布时间:2022-5-23 23:00
|
A/D转换原理及参数指标/ i2 _, T+ v, N# H& y% c9 V - X) Z! j' j) x- N6 P2 c 1. 采样定理. `, s) t1 u- K+ K. ^# Q3 { % g+ o. P1 E! | 2. 为了正确无误的用图5.2.2中所示的采样信号vs表示模拟信号vi,必须满足式中, fs>=2fmax/ Y5 H( k C* Y. [/ R + D7 ]9 I1 {* e: H- w# | fs为采样频率;fmax为输入信号vi的最高频率分量的频率;上式就是所谓的采样定理。满足采样定理的条件下,可以用一个低通滤波器将信号vs还原为vi,这个低通滤波器的电压传输系数|A(f)|在低于fmax的范围内应保持不变,而在fs-fmax以前应迅速下降为零,采样定理规定了A/D转换的频率下限。. x0 A3 ?: K# ] L& \$ t K $ _- d4 Z a$ A$ ]3 c AD7792 遇到的问题/学到的知识点 1 Z7 c4 J2 L8 f' Q' B- B 学到的知识点: 1.在stm32中 : V8 D: o5 A4 C4 }* d( x U8 : unsigned char 1 J, H# F0 c7 N" D4 k' C U16: unsigned short2 `5 U( Z0 Z8 T( r) t" D U32: unsigned int % f$ E0 j9 R' O0 E. P# L! }1 c 2. 在stm32中 AD7792采样的电压数值要经过转换成ASCII码字符在串口中打印出来有两种编程方式实现:8 X2 [7 t2 _' J1 G' L( q u8TempD;3 x( x% Y9 X( ~* n* V u16 Datau16;# i q& R7 ?8 R" @: F, b6 U char str[20];% q4 {% A/ h3 x2 R b! O9 \ " ]; l4 H; f' g* }' X4 G' o unsigned short iData[3];- A; q6 ?2 h5 p5 S) C u8 Strvbat[8]={'/','/','/',',',0,0,0,0}; u8 ASCII[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','+',//10->16 ' Z; O* z0 t4 C. B. q) _/ G ',',//11-17 '-',//12-18 '.',//13-19 K, O9 t1 O' R 6 C( ^& a7 ?8 f9 F- P '/',//14-203 C: J2 h3 F; Z: k$ C) k 4 Q3 i! M7 g/ }* p };4 S; \( @ G4 h, `6 E $ Y" M; [0 U3 U* F8 A0 n& G 方式一:(简洁版)9 [% v G# O1 Q1 C" J r4 p d 2 t; _( H* ^& V2 j AD_VBat[TempD] = SPI_Read16Bit();6 [, h; N9 M8 f 0 e* ?+ d2 z% B# z( D memcpy(&iData[0],& AD_VBat[TempD],2); sprintf(str,"%d",iData[0]); UART1_TX485_Puts(USART1,&str[0]); 4 x! J+ O: D3 I5 L / A0 [) @# _: X: \ 方式二:(复杂版)1 g: z _! b1 K+ I" @$ ^1 a 7 {5 l, _# Z1 D9 f+ v, J& D AD_VBat[TempD] = SPI_Read16Bit(); Datau16 = AD_VBat[TempD];- y4 h8 P& |8 s/ _3 I Strvbat[0]=ASCII[Datau16/10000]; O) j& x) `+ N* A9 F0 b, F Strvbat[1]=ASCII[Datau16%10000/1000]; $ v- u Y/ R# x! F' O Strvbat[2]=ASCII[Datau16%1000/100];7 E# Q5 \: C3 }) E; K( t, i/ @* t0 N Strvbat[3]=ASCII[Datau16%100/10]; Strvbat[4]=ASCII[Datau16%10];; \- w- M: g9 _5 G/ z4 G/ P3 \ UART1_TX485_Puts(USART1,&Strvbat[0]); 7 \: X7 W7 l. a, c' u& { o. z while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);+ | m; {3 y4 u * _9 I$ K( [. e& e4 s 3.遇到的问题; s1 g- ^5 _! K3 O! u [ Z 问题一:通过串口打印,采样的数值为32768左右转化后的电池电压为2.5V,而电池实际电压应该为3.32v采样数值应该为43582左右的数值; 9 ^8 G0 H' o3 M# S5 ^ 问题根源:通道切换的问题; AD7792有3个模拟输入通道,初始化AD7792配置函数中,写配置寄存器SPI_SendByte(0x10); /* 写配置寄存器*/, z% ]) H/ m' O+ p/ M. H" k SPI_Send16Bit(0x1080); // 偏置电压禁用禁用熔断电流单极性编码内部基准1 n3 I ?2 `4 W2 m9 H SPI_Send16Bit(0x1080)设置的采样通道是采样电流的通道,所以采样的是电流的数值;! F. M' q/ L% ~7 y0 W 题二:在移植AD7792独立出来时,发现电池电压采样值打印为0000; 2 H2 U4 k+ p$ p2 J4 @7 g2 S 问题根源:SPI配置问题; & s4 V' `- I2 F 原理图:5 }$ n: ` H' W' |3 Y 0 f% G2 v9 E2 ]* x, w
/ |/ h# Q, _' }$ e5 i8 _ ' l* m. u7 c+ |. }3 }1 z; ?6 T 错误配置:5 G0 `1 [$ y: L; @ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7 ; : f$ }1 O9 L- X7 s: C& ^9 E GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 j" u3 C* d" p$ N% X GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); : j2 w M6 B# i$ H2 w* b 5 Z2 r. B, g* `( ]3 f4 G" U% s GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;! _$ @# f% b# R- [! o- o. t 6 x0 v4 x! }" R! H! c6 M! `3 j: ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 2 c2 _. d# z! `, V" ?% ~ GPIO_Init(GPIOA, &GPIO_InitStructure);' [4 w* U; [% P9 @, y5 w2 v GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;+ w b7 B- h" I3 E/ V. d + W3 o+ V4 K7 j/ e$ p" ] GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 4 c: [. V( a* X$ l GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出) _6 D- M4 p6 y GPIO_Init(GPIOA, &GPIO_InitStructure); # N( C) E( X" u, `8 u2 i" r9 n 正确配置: 7 R c1 n3 d, r p /* Configure SPI1 pins: SCK, MISO and MOSI */ 9 k! T& {; q. h/ y" ]; ^ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);3 k. `* q6 z( u }- D 7 p0 _0 U" s$ p $ t7 L, y. r: o4 Q: K: h0 X: y ( W* G: j/ h3 y, f5 _; h6 V, _ /* 配置MISO为输入 */5 ?% p2 a9 k% V * g, Q4 `; k f/ O/ v GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; , j4 ? r4 J8 g6 w3 i1 g GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 V/ o% p; i+ L S, [ 9 k$ L( H7 T( m% S9 p GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);% X% x+ G. r& w' W+ g/ ]! b 5 R5 o4 `; U6 W |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版