概述
前言
高情已逐晓云空,不与梨花同梦。
最近,因为准备电赛的需要,需要用到程控增益放大模块(PGA113
),也就是这篇博文的主角:破哥啊(谐音称呼),需要调通这位大哥,今天终于完成了驱动的程序代码。说起调 PGA113
这位大哥的过程,真是有点小感慨吧。
本来这个模块是另外一个队伍做第一个比赛准备项目需要用到的增益放大模块,他们买的是芯片(为什么买芯片呢?因为模块太贵,买不起。这里附上淘宝模块购买链接:https://item.taobao.com/item.htm?id=673514214019,我是推荐先买一个模块,玩明白了再自己之后买芯片自己做,不要像我们一样,直接买了六七个芯片,结果做出来差点没人会调,大佬的话就可以按自己的想法来做了),然后自己打板焊电路,做模块,结果他们队负责软件的同学调不出来,然后我们就展开了“礼让推辞”环节,最后调 PGA113
的任务就落到我身上了。
还好最后调出来了,因为网上能找到的资料也不多,就根据一个芯片手册看着慢慢弄,还是英文的,这里省略一百字吐槽的话,废话不多说,下面给大家分享一下。
一、介绍
- 芯片手册介绍:pga113芯片手册.pdf
简介
PGA
是Pmgrammable Gain Amplifier
的英文名称,中文意思是 可编程增益放大器。PGA
是一种通用性很强的放大器,其放大倍数可以根据需要用程序进行控制。采用这种放大器,可通过程序调节放大倍数,使A/D
转换器满量程信号达到均一化,因而大大提高测量精度。
应用程序:
- 远程静电计阅读
- 自动增益控制
- 便携式数据采集
手册目录:
SPI时序图
增益控制范围选择:
最重要的部分:SPI命令
- 这里只需要将 SPI 配置为:
Transmit Only Master
模式即可,我们不需要PGA113
对单片机进行数据传输; - 记住写指令的 十六进制 表示:
0x2a00(0x0010 1010 0000 0000)
,
0010 1010:表示 写(write)模式;
第一个0000:表示增益放大倍数;
第二个0000:表示选择的通道数,(这里用的通道0,我们设计的模块没有用通道1,因为第一个版本是用了通道0,没用通道1,第二版本就换了一下,事实证明:用通道 0 还是比较有效的,就是存在一个初始就会有一倍放大的效果(Bug))
下面介绍我们的主角(PGA113):
- 接线图:(这里我用的是
SPI1
,软件片选:CS
,用DAC
输出1.5 V
的参考电压)
STM32H750VBT6单片机 | PGA113模块 |
---|---|
PA4 (DAC1_OUT ) | VREF |
GND | GND |
PA5 (SPI1_SCK) | SCLK |
PA7 (SPI1_MOSI) | DIO |
PC4 (SPI1_CS) | CS |
二、新建工程
1、进行 CubeMX 配置
-
开启时钟:
-
配置时钟树:
-
开启DAC:
-
SPI 配置:
-
生成代码:
- 上述就完成了 CubeMX 生成代码的过程。
三、代码编写
- 在
main.c
文件中添加以下代码:
/* USER CODE BEGIN PTD */
//定义增益数组
uint16_t gainBuffer[8]={ 0x2a00,0x2a10,0x2a20,0x2a30,
0x2a40,0x2a50,0x2a60,0x2a70 };
//分别对应系统放大:
//对应数组下标:0, 1, 2, 3, 4, 5, 6, 7
// 二进制增益:1, 2, 4, 8,16,32, 64,128
// 增益范围:1, 2, 5,10,20,50,100,200
//CS片选低电平为有效使能, CS片选高电平不使能
#define SPI_CS_Enable() HAL_GPIO_WritePin(GPIOC,SPI1_CS_Pin,GPIO_PIN_RESET)
#define SPI_CS_Disable() HAL_GPIO_WritePin(GPIOC,SPI1_CS_Pin,GPIO_PIN_SET)
/* USER CODE END PTD */
//定义函数控制增益放大倍数
void SetGain(int gain)
{
uint8_t gtemp=0;
switch(gain)
{
case 1:
gtemp=0;
break;
case 2:
gtemp=1;
break;
case 5:
gtemp=2;
break;
case 10:
gtemp=3;
break;
case 20:
gtemp=4;
break;
case 50:
gtemp=5;
break;
case 100:
gtemp=6;
break;
case 200:
gtemp=7;
break;
}
SPI_CS_Enable();
HAL_SPI_Transmit(&hspi1, (uint8_t *)gainBuffer+gtemp*2, 1, 0xffff);
SPI_CS_Disable();
}
/* USER CODE BEGIN 2 */
PrintfUart("wang_testrn");
//启动DAC转换器
HAL_DAC_Start(&hdac1,DAC1_CHANNEL_1);
//电压转换:利用DAC输出1.5V的电压,作为参考电压(VREF)
HAL_DAC_SetValue(&hdac1, DAC1_CHANNEL_1, DAC_ALIGN_8B_R, 116);
SetGain(50);
PrintfUart("Overrn");
/* USER CODE END 2 */
四、实验结果
分享结束,其实写完觉得也没有特别难,就是一些细节要注意一下,例如:写命令的十六进制格式别写错(8+2=a,不是6)、还有将十六进制转换为八进制,这两个部分是我写驱动时候害我不浅的地方,提醒大家注意。
以上就是本篇博文的分享内容,如果对你有帮助的话,麻烦帮忙点个小赞,谢谢!!!
最后
以上就是迷你老师为你收集整理的STM32H750VBT6驱动程控增益放大模块PGA113——基于CubeMX的Hal库前言一、介绍二、新建工程三、代码编写四、实验结果的全部内容,希望文章能够帮你解决STM32H750VBT6驱动程控增益放大模块PGA113——基于CubeMX的Hal库前言一、介绍二、新建工程三、代码编写四、实验结果所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复