高情已逐晓云空,不与梨花同梦。
最近,因为准备电赛的需要,需要用到程控增益放大模块(PGA113
),也就是这篇博文的主角:破哥啊(谐音称呼),需要调通这位大哥,今天终于完成了驱动的程序代码。说起调 PGA113
这位大哥的过程,真是有点小感慨吧。
本来这个模块是另外一个队伍做第一个比赛准备项目需要用到的增益放大模块,他们买的是芯片(为什么买芯片呢?因为模块太贵,买不起。这里附上淘宝模块购买链接:https://item.taobao.com/item.htm?id=673514214019,我是推荐先买一个模块,玩明白了再自己之后买芯片自己做,不要像我们一样,直接买了六七个芯片,结果做出来差点没人会调,大佬的话就可以按自己的想法来做了),然后自己打板焊电路,做模块,结果他们队负责软件的同学调不出来,然后我们就展开了“礼让推辞”环节,最后调 PGA113
的任务就落到我身上了。
还好最后调出来了,因为网上能找到的资料也不多,就根据一个芯片手册看着慢慢弄,还是英文的,这里省略一百字吐槽的话,废话不多说,下面给大家分享一下。
PGA
是Pmgrammable Gain Amplifier
的英文名称,中文意思是 可编程增益放大器。PGA
是一种通用性很强的放大器,其放大倍数可以根据需要用程序进行控制。采用这种放大器,可通过程序调节放大倍数,使A/D
转换器满量程信号达到均一化,因而大大提高测量精度。
增益控制范围选择:
Transmit Only Master
模式即可,我们不需要 PGA113
对单片机进行数据传输;0x2a00(0x0010 1010 0000 0000)
,
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 |
开启时钟:
配置时钟树:
开启DAC:
SPI 配置:
生成代码:
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_test\r\n");
//启动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("Over\r\n");
/* USER CODE END 2 */
分享结束,其实写完觉得也没有特别难,就是一些细节要注意一下,例如:写命令的十六进制格式别写错(8+2=a,不是6)、还有将十六进制转换为八进制,这两个部分是我写驱动时候害我不浅的地方,提醒大家注意。
以上就是本篇博文的分享内容,如果对你有帮助的话,麻烦帮忙点个小赞,谢谢!!!