STM32管脚模拟协议驱动双路16位DAC芯片TM8211

这篇具有很好参考价值的文章主要介绍了STM32管脚模拟协议驱动双路16位DAC芯片TM8211。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32管脚模拟协议驱动双路16位DAC芯片TM8211

TM8211是一款国产的低成本双路16位DAC驱动芯片,可以应用于普通数模转换领域及音频转换领域等。这里介绍STM32 HAL库驱动TM8211的逻辑,时序和代码。

TM8211的功能特性为:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
TM8211的内部电路功能框图为:
tm8211,STM32,stm32,TM8211,DAC,16位,双路

TM8211驱动逻辑

TM8211支持典型的3.3V供电和5V供电,在驱动后进行电压输出时,需要注意,如以3.3V供电为例,并非是驱动输出0~3.3V的范围,而是半范围,即驱动输出的电压范围为0.825V – 2.475V (1/4VDD-- 3/4VDD)。

TM8211的管脚定义为:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
tm8211,STM32,stm32,TM8211,DAC,16位,双路
其中控制管脚为WS, BCK和DIN,LCH和RCH为两个输出通道,介绍如下:
WS: 高电平指示对LCH通道进行配置,低电平指示对RCH通道进行配置
BCK:配置过程的时钟线,TM8211在时钟上升沿锁存数据,在WS的某个电平状态,前16个时钟锁存的数据有效,后面的忽略
DIN: 配置过程的数据线

TM8211典型应用

TM8211可应用于双通道音频输出,如:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
也可以控制输出交流波形,通过隔直电容去掉直流电压部分。

工程配置

TM8211的配置时钟最大可达18.4MHz,在不需要配置MHz级信号输出控制时,可以采用GPIO管脚模拟协议对TM8211输出电压进行控制。这里介绍STM32CUBEIDE开发平台,以STM32G030F6P6为例,GPIO管脚模拟协议配置TM8211的范例。需要进行更高速配置时则需要调整为SPI硬件接口驱动。

首先建立基本工程并配置时钟:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
tm8211,STM32,stm32,TM8211,DAC,16位,双路
配置3个GPIO作为驱动接口:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
保存并生成初始工程代码:
tm8211,STM32,stm32,TM8211,DAC,16位,双路

工程代码:

工程代码实现都在main.c文件里,代码里用到的微秒延时函数参考: STM32 HAL us delay(微秒延时)的指令延时实现方式及优化

两个通道都实现为类似正弦波的连续波形输出:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define TM8211_WS_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define TM8211_WS_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define TM8211_BCK_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define TM8211_BCK_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define TM8211_DIN_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define TM8211_DIN_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
__IO float usDelayBase;
void PY_usDelayTest(void)
{
  __IO uint32_t firstms, secondms;
  __IO uint32_t counter = 0;

  firstms = HAL_GetTick()+1;
  secondms = firstms+1;

  while(uwTick!=firstms) ;

  while(uwTick!=secondms) counter++;

  usDelayBase = ((float)counter)/1000;
}

void PY_Delay_us_t(uint32_t Delay)
{
  __IO uint32_t delayReg;
  __IO uint32_t usNum = (uint32_t)(Delay*usDelayBase);

  delayReg = 0;
  while(delayReg!=usNum) delayReg++;
}

void PY_usDelayOptimize(void)
{
  __IO uint32_t firstms, secondms;
  __IO float coe = 1.0;

  firstms = HAL_GetTick();
  PY_Delay_us_t(1000000) ;
  secondms = HAL_GetTick();

  coe = ((float)1000)/(secondms-firstms);
  usDelayBase = coe*usDelayBase;
}


void PY_Delay_us(uint32_t Delay)
{
  __IO uint32_t delayReg;

  __IO uint32_t msNum = Delay/1000;
  __IO uint32_t usNum = (uint32_t)((Delay%1000)*usDelayBase);

  if(msNum>0) HAL_Delay(msNum);

  delayReg = 0;
  while(delayReg!=usNum) delayReg++;
}
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define us_num 2

void TM8211_OUTPUT_CONFIG(uint16_t LCH, uint16_t RCH)
{
	uint8_t i;
	TM8211_WS_L;
	PY_Delay_us_t(us_num);

	for(i=0; i<16; i++)
	{
		TM8211_BCK_L;
		if( (RCH>>(15-i))&0x0001 ) TM8211_DIN_H;
		else TM8211_DIN_L;
		PY_Delay_us_t(us_num);
		TM8211_BCK_H;
		PY_Delay_us_t(us_num);
	}

	PY_Delay_us_t(us_num);

	TM8211_WS_H;
	PY_Delay_us_t(us_num);
	for(i=0; i<16; i++)
	{
		TM8211_BCK_L;
		if( (LCH>>(15-i))&0x0001 ) TM8211_DIN_H;
		else TM8211_DIN_L;
		PY_Delay_us_t(us_num);
		TM8211_BCK_H;
		PY_Delay_us_t(us_num);
	}

	PY_Delay_us_t(us_num);
	TM8211_WS_L;
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint16_t C1 = 0, C2 = 0;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  PY_usDelayTest();
  PY_usDelayOptimize();

  TM8211_OUTPUT_CONFIG(0x0000, 0x0000);
  PY_Delay_us_t(5000000);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	for(uint16_t i=0x8000; i<0xffff; i++)
	{
		C1=C2=i;
		TM8211_OUTPUT_CONFIG(C1, C2);
	}

	for(uint16_t j=0x0000; j<0x7fff; j++)
	{
		C1=C2=j;
		TM8211_OUTPUT_CONFIG(C1, C2);
	}

	for(uint16_t j=0x7fff; j>0x0000; j--)
	{
		C1=C2=j;
		TM8211_OUTPUT_CONFIG(C1, C2);
	}

	for(uint16_t i=0xffff; i>0x8000; i--)
	{
		C1=C2=i;
		TM8211_OUTPUT_CONFIG(C1, C2);
	}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @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_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pins : PA4 PA5 PA7 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
  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);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

其中,配置值和输出电压的关系参考如下测试结果(3.3V供电)了解:
tm8211,STM32,stm32,TM8211,DAC,16位,双路
如果要应用供电参考电压全范围输出的双路16位DAC,则参考:STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出

例程下载

STM32G030F6P6管脚模拟协议驱动双路16位DAC芯片TM8211例程

–End–文章来源地址https://www.toymoban.com/news/detail-599404.html

到了这里,关于STM32管脚模拟协议驱动双路16位DAC芯片TM8211的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(28)
  • STM32实验-PWM DAC模拟输出

    一般一个STM32只有2个DAC输出通道,如果需要多路DAC输出,可以选择外扩DAC,但成本回相当高。于是在一些精度要求不高的场合,我们采用定时器输出PWM和RC滤波器模拟DAC来代替外扩DAC。 PWM占空比可由以下式子计算出:p = n / N (n是on的时间,即带宽,N是周期) PWM周期是由ARR决定

    2024年02月08日
    浏览(17)
  • STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. PCA9555芯片驱动函数 总结         PCA9555可设置16路输入或输出口,I2C接口,用于IO扩展,3个硬件地址引脚寻址,工作电压:VCC(2.3V 至 5.5V)。 1)框图   INT:中断输出 A0,

    2024年02月11日
    浏览(27)
  • STM32上模拟CH340芯片的功能 (一)

    #虚拟串口模拟CH340# 代码gitee地址:STM32F103_CH340: 用STM32模拟ch340USB串口的功能 1. 确定通信接口:CH340是一款USB转串口芯片,因此您需要选择STM32上的某个USB接口来实现USB通信。通常情况下,STM32系列芯片都有内置的USB接口,您可以根据您的具体型号选择合适的接口。 2. 实现USB功

    2024年02月21日
    浏览(22)
  • STM32--PCA9685驱动(16路舵机驱动模块)

    目录 PCA9685接线: PCA9685简介: PCA9685地址位寄存器: MODE1寄存器,地址0x00,可读、可写: 寄存器地址: PCA9685代码注解: 1.PCA9685数据写入:  2.PCA9685数据读取: 3.PCA9685的频率设置: 4.PCA9685的PWM设置: 舵机转动角度置换: PCA9685驱动代码: main.c程序: IIC驱动:(正点原子

    2024年03月25日
    浏览(27)
  • STM32使用HAL库驱动TA6932数码管驱动芯片

    8段16位,支持共阴共阳LED数码管。 推挽配置即可。 1、使用TA6932_Init进行初始化 2、使用TA6932_Disp(uint8_t *_ucPtr,uint8_t _ucLenth)进行显示,_upPtr指针指向段码,_ucLenth为显示长度,不超过16位。

    2024年02月07日
    浏览(20)
  • STM32驱动CH9121网络串口透传芯片

    目录 一.介绍 二.配置 1.搜索配置  基础设置 端口设置 2.串口配置 ①CFG脚进入配置: ②串口协商进入: 三、使用CH9121 四、测试 关于CH9121的资料和配置软件 :提取码:3fxd 网络串口透传芯片CH9121,官网资料:网络串口透传芯片CH9121 这里摘取一些简介 CH9121 集成TCP/IP 协议栈,

    2024年02月10日
    浏览(18)
  • stm32驱动MCP2515芯片,项目已通过测试

    最近公司做一个项目,需要3路can通道,但是stm32看了很久,最多也就只有2个can,所以找到了一款MCP2515芯片,可以用spi驱动can。 已经实现了can的发送和接收,接收采用的是外部中断接收的方式。和单片机本身带的can功能一样。 还有就是要注意的是CAN的接收是通过外部中断引脚

    2024年02月13日
    浏览(20)
  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. BH1750芯片驱动函数 总结             BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏

    2024年02月02日
    浏览(59)
  • 野火STM32F103驱动GT911触摸芯片

    芯片介绍 GT911 是专为 7”~8”设计的新一代 5 点电容触控 方案,拥有 26 个驱动通道和 14 个感 应通道,以满足更高的 touch 精度要求。 GT911 可同时识别 5 个触摸点位的 实时准确位置 , 移动轨迹 及 触摸面积。 并可根据主控需要,读取相应点数的触摸信息。 芯片原理图 管脚定

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包