STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出
程序员文章站
2022-06-30 17:12:48
...
因课题需求 所以选择了多通道的外置DAC芯片——LTC2600
-
LTC2600介绍
英文芯片手册
添加链接描述
中文芯片手册
添加链接描述
LTC2600是AD公司的八通道16位DAC,体积小,分辨率高,使用SPI驱动方式编程控制
引脚功能:
时序图
我用的是GPIO端口模拟SPI通讯 -
STM32CubeMX
-
代码部分
#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void SendDA_LTC2600(uint8_t channel,uint16_t data);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
SendDA_LTC2600(0x00,0x0fff);
while (1)
{
}
}
//向LTC2600写入数据
void SendDA_LTC2600(uint8_t channel,uint16_t data)
{
uint32_t xkdata=0,i;
xkdata|=0x03<<20;//命令位c1和c0写为1:写至输入寄存器n,更新所有寄存器
xkdata|=(channel&0x0f)<<16;//通道地址
xkdata|=data&0xffff;//防止data数据过大,最大支持16bit
xkdata<<=8;//数据左移8位,低八位为空
CS_0;//片选(引脚7),片选为低时,sck被使能,数据转移至寄存器
HAL_Delay(200);
for(i=0;i<24;i++)
{
SCK_0;//关时钟
if(xkdata&0x80000000)//对xkdat的31位到8位按位与
{
SDI_1;//如果为1,则SDI高电平
}
else
{
SDI_0;//如果为0,则SDI低电平
}
SCK_1;//开时钟
xkdata<<=1;
}
CS_1;//片选拉高,sck禁能,执行规定的命令
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
/*Configure GPIO pins : PC2 PC3 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PA12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
设定芯片的参考电压为2.5V,用电压表测得LTC2600 A通道引脚电压为0.15V,与设定值相符
欢迎大家批评指正和交流啊~
上一篇: STM32L031 ADC管脚电压采样