欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出

程序员文章站 2022-06-30 17:12:48
...

因课题需求 所以选择了多通道的外置DAC芯片——LTC2600

  1. LTC2600介绍
    英文芯片手册
    添加链接描述
    中文芯片手册
    添加链接描述
    LTC2600是AD公司的八通道16位DAC,体积小,分辨率高,使用SPI驱动方式编程控制
    引脚功能:
    STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出
    时序图
    STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出
    我用的是GPIO端口模拟SPI通讯

  2. STM32CubeMX
    STM32CubeMX--STM32L0系列外置DAC芯片(LTC2600)电压输出

  3. 代码部分

#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,与设定值相符

欢迎大家批评指正和交流啊~