基于二阶广义积分器的单相PLL设计与Simulink实现

版权申诉
5星 · 超过95%的资源 7 下载量 112 浏览量 更新于2024-12-09 1 收藏 13KB RAR 举报
资源摘要信息:"锁相环技术是电子工程领域中一个非常重要的概念,尤其在通信、电力电子以及信号处理等领域应用广泛。锁相环(Phase-Locked Loop, PLL)是一种可以自动跟踪输入信号相位的反馈控制电路,它能够产生一个与输入信号同步的输出信号。在本资源中,我们关注的是使用MATLAB软件中的Simulink工具构建的PLL系统,特别是一个基于二阶广义积分器(Second Order Generalized Integrator, SOGI)的软件锁相环。 首先,我们需要明确几个关键概念: 1. **PLL(Phase-Locked Loop)**:锁相环能够对输入信号的频率和相位进行锁定,使其输出信号与输入信号在频率和相位上保持一致。PLL的三个主要组成部分包括:相位检测器(Phase Detector)、环路滤波器(Loop Filter)和压控振荡器(Voltage-Controlled Oscillator, VCO)。 2. **SOGI(Second Order Generalized Integrator)**:二阶广义积分器是一种特殊的积分器,它在处理交流信号时能够提供更好的性能,特别是在频率跟踪和噪声抑制方面。二阶广义积分器可以看作是两个一阶积分器的串联,能够在更宽的频率范围内提供精确的相位跟踪和控制。 3. **Simulink**:Simulink是MATLAB的一个附加产品,它提供了一个交互式的图形化环境,用于模拟、多域动态系统以及嵌入式系统的多领域设计。Simulink允许用户通过拖放的方式快速构建模型,并可以对这些模型进行仿真以验证系统的行为。 在资源标题中提及的“PLL_SOGI_2010ra4.rar”文件是一个压缩包文件,包含了文件“PLL_SOGI_2010ra4.mdl”,后者是一个Simulink模型文件。通过这个模型文件,工程师和研究人员可以搭建起一个基于二阶广义积分器的软件锁相环模型,并在MATLAB/Simulink环境中进行仿真和分析。 这种基于SOGI的PLL设计方法,尤其适用于那些需要精确控制相位和频率的场合,比如在电力系统中的相位同步、无线通信系统中的载波恢复,以及在电机驱动控制系统中对转子位置的精确跟踪等。二阶广义积分器相较于传统的PLL设计,能够提供更好的动态响应和更强的鲁棒性,特别是在有噪声或者频率变化较大的应用场合。 在设计基于SOGI的PLL时,需要考虑到几个关键的设计参数: - **积分器系数**:决定了SOGI的频率响应特性。 - **滤波器设计**:环路滤波器的参数设置直接影响PLL的稳定性和噪声性能。 - **控制器参数**:包括比例和积分增益等,这些参数需要经过仔细调整以确保系统稳定性和跟踪性能。 搭建好这样的PLL系统后,工程师可以对模型进行仿真,分析其在不同条件下的性能表现,例如在频率变化、噪声干扰和负载扰动情况下的系统响应。通过这些仿真测试,可以对锁相环系统的性能有一个全面的了解,并在实际应用之前进行必要的调整和优化。 综合来看,该资源对于从事电力电子、通信系统设计以及自动控制等领域的工程师和研究人员来说,是一个非常有价值的参考资料。通过研究和分析这个基于SOGI的PLL模型,可以帮助他们更好地理解和掌握锁相环设计的深层原理和技术细节。"

#include "main.h" #include "stdio.h" #include "string.h" #include "time.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { time_t now = time(NULL); struct tm *timeinfo = localtime(&now); char time_str[9]; sprintf(time_str, "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); HAL_UART_Transmit(&huart1, (uint8_t *)time_str, strlen(time_str), HAL_MAX_DELAY); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; 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_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin : PA9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } 在以上代码的基础上,编写代码以实现计算发送 hh:mm:ss到单片机,修改单片机时间

2023-05-30 上传

修改以下程序,使其接收指令后发送一个hello,world字符串。#include "main.h"#include "usart.h"#include "gpio.h"#include "stdio.h"#include "string.h"uint8_t aRxBuffer;void SystemClock_Config(void);int fputc(int ch, FILE *f){ uint8_t temp[1] = {ch}; HAL_UART_Transmit(&huart1, temp, 1, 0xffff);return ch;}int fgetc(FILE * f){ uint8_t ch = 0; HAL_UART_Receive(&huart1,&ch, 1, 0xffff); return ch;}int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); user_main_printf(""); /* USER CODE END 2 */ while (1) { }}void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ char *pCmd = NULL; uint8_t len; switch(aRxBuffer){ case '1': pCmd = "command 1\r\n"; len = strlen(pCmd); break; case '2': pCmd = "command 2\r\n"; len = strlen(pCmd); break; case '3': pCmd = "command 3\r\n"; len = strlen(pCmd); break; case '4': pCmd = "command 4\r\n"; len = strlen(pCmd); break; default: pCmd = "command cmd\r\n"; len = strlen(pCmd); break; } HAL_UART_Transmit(&huart1, (uint8_t *)pCmd, len,0xFFFF); HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); }void Error_Handler(void){}#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t *file, uint32_t line){ }#endif

2023-05-25 上传