【NUCLEO H533RE】DAC测试与电压输出精度
[复制链接]
1、DAC测试介绍
dac输出的精度和带负载能力相互有关。本次测试使用STM32H533RE芯片集成的DAC1外设,由于NUCLEO H533RE的开发板设计原因。DAC1的通道1输出引脚PA4没有被引出来,虽然板子上面应该有空闲的接口引脚。希望ST公司在设计开发板时应该注意这一点。而且,CAN的引脚也没有引出来,SPI1的引脚也有冲突。
所以没有办法只好飞线了。通过SB3的引脚将PA4引出来。
测试的DAC负载使用20K的电阻作为负载。最大限流输出为电流0.16mA,应该不会影响芯片的精度变化。本次测试参考了同系列芯片STM32H563的“DAC_SignalsGeneration”例程。测量仪器为100M示波器。
2、硬件连接
测试负载20K欧姆电阻R,
GND <===> R 2pin
DAC PA4 <===> R 1pin
3、参数配置
(1)系统时钟设置
时钟源使用24MHZ外部晶振,系统时钟为250MHZ。
DAC外设时钟为250MHZ
时钟源使用HCLK。
(2)DAC参数设置
DAC1的输出通道为CH1,输出外设引脚为PA4,Trigger触发源:时钟TIM1触发,启用GPDMA1通道。
(3)TIM1参数设置
时钟设置为Internal clock,其它为默认,分频系数和计数都没有设置,这个我感到疑惑。
(4)GPDMA1参数设置
循环模式打开, 通道设置为Channel3,DMA源 端口:Port1,Burst:1,Data Width:byte,
目标端口为设备。Data width:word
4、程序分析与工作介绍
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] DAC Channel1 EscalatorConfig
* @param None
* @retval None
*/
static void DAC_Ch1_EscalatorConfig(void)
{
/*##-1- Initialize the DAC peripheral ######################################*/
if (HAL_DAC_Init(&hdac1) != HAL_OK)
{
/* DAC initialization Error */
Error_Handler();
}
/*##-2- Enable DAC selected channel and associated DMA ######################*/
if (HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t *)aEscalator8bit, 6, DAC_ALIGN_8B_R) != HAL_OK)
{
/* Start DMA Error */
Error_Handler();
}
}
/**
* @brief DAC Channel1 Triangle Configuration
* @param None
* @retval None
*/
static void DAC_Ch1_TriangleConfig(void)
{
/*##-1- Initialize the DAC peripheral ######################################*/
if (HAL_DAC_Init(&hdac1) != HAL_OK)
{
/* DAC initialization Error */
Error_Handler();
}
/*##-2- DAC channel2 Triangle Wave generation configuration ################*/
if (HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_1023) != HAL_OK)
{
/* Triangle wave generation Error */
Error_Handler();
}
/*##-3- Enable DAC Channel1 ################################################*/
if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
/*##-4- Set DAC channel1 DHR12RD register ################################################*/
if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) != HAL_OK)
{
/* Setting value Error */
Error_Handler();
}
}
/**
* @brief EXTI line detection callbacks
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*/
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
/* Change the wave */
ubKeyPressed = 1;
/* Change the selected waves forms */
ubSelectedWavesForm = !ubSelectedWavesForm;
}
static void DAC_Ch1_TriangleConfig(void);定义修改触发控制
static void DAC_Ch1_EscalatorConfig(void);定义修改采样设置
/* -- Sample board code to send message over COM1 port ---- */
printf("Welcome to STM32 world !\n\r");
/* -- Sample board code to switch on leds ---- */
BSP_LED_On(LED_GREEN);
HAL_TIM_Base_Start(&htim1);
/* USER CODE END BSP */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* -- Sample board code for User push-button in interrupt mode ---- */
if (BspButtonState == BUTTON_PRESSED)
{
HAL_DAC_DeInit(&hdac1);
/* Update button state */
BspButtonState = BUTTON_RELEASED;
/* -- Sample board code to toggle leds ---- */
BSP_LED_Toggle(LED_GREEN);
/* ..... Perform your action ..... */
/* select waves forms according to the USER push-button status */
if (ubSelectedWavesForm == 1)
{
/* The triangle wave has been selected */
/* Triangle Wave generator -------------------------------------------*/
DAC_Ch1_TriangleConfig();
}
else
{
/* The escalator wave has been selected */
/* Escalator Wave generator -------------------------------------------*/
DAC_Ch1_EscalatorConfig();
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
主程序使用 HAL_TIM_Base_Start(&htim1);开始DAC的输出,通过按下User键控制是DMA中的const uint8_t aEscalator8bit[6] = {0x0, 0x33, 0x66, 0x99, 0xCC, 0xFF};的输出类型。
5、测试过程
测试开始将程序烧录到芯片
通过按键user改变输出,
但是输出出现了信号不稳定的现象,信号经常的丢失和跳动
6、总结
本次测试整个过程都很多不确定的地方,例如:信号除了0V时稳定,其它都不是很稳定。不会知道是不是因为设置的原因。stm32cubeMX的GPDMA设置代码无法找到设置的参数。
/**
* @brief GPDMA1 Initialization Function
* @param None
* @retval None
*/
static void MX_GPDMA1_Init(void)
{
/* USER CODE BEGIN GPDMA1_Init 0 */
/* USER CODE END GPDMA1_Init 0 */
/* Peripheral clock enable */
__HAL_RCC_GPDMA1_CLK_ENABLE();
/* GPDMA1 interrupt Init */
HAL_NVIC_SetPriority(GPDMA1_Channel3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(GPDMA1_Channel3_IRQn);
/* USER CODE BEGIN GPDMA1_Init 1 */
/* USER CODE END GPDMA1_Init 1 */
/* USER CODE BEGIN GPDMA1_Init 2 */
/* USER CODE END GPDMA1_Init 2 */
}
|