【DigiKey创意大赛】基于STM32H7B3I-DK的智能家居助手+38KHz红外载波信号产生与测试
[复制链接]
一.准备
基于MDK5.38其安装不再赘述。
下载软件包en.stm32cubeh7_v1-11-0
https://www.st.com/zh/embedded-software/stm32cubeh7.html
解压en.stm32cubeh7_v1-11-0.zip打开STM32Cube_FW_H7_V1.11.0\Projects\STM32H7B3I-DK\Applications\FreeRTOS\FreeRTOS_ThreadCreation\MDK-ARM\Project.uvprojx
安装STM32H7xx_DFP.3.1.1
即可编译下载Demo工程
二.38KHz红外载波信号产生与PWM极限测试
引脚
原理图看到可以使用PH10进行测试,对应TIM5_CH1
驱动代码
驱动实现pwm.c
#include "main.h"
#define TIMx TIM5
#define CLK 280000000ul
/* Timer handler declaration */
TIM_HandleTypeDef TimHandle;
/* Timer Output Compare Configuration Structure declaration */
TIM_OC_InitTypeDef sConfig = {0};
/* Counter Prescaler value */
uint32_t uhPrescalerValue = 0;
void pwm_init(uint32_t freq)
{
GPIO_InitTypeDef GPIO_InitStruct;
uhPrescalerValue = (uint32_t)(SystemCoreClock / CLK) - 1;
__HAL_RCC_TIM5_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
/* PH10 TIM5 CH1
*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
GPIO_InitStruct.Pin = GPIO_PIN_10;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
/* TIM5
*/
TimHandle.Instance = TIMx;
TimHandle.Init.Prescaler = uhPrescalerValue;
TimHandle.Init.Period = (CLK/freq) - 1;
TimHandle.Init.ClockDivision = 0;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
/*##-2- Configure the PWM channels #########################################*/
/* Common configuration for all channels */
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
/* Set the pulse value for channel 1 */
sConfig.Pulse = TimHandle.Init.Period/2;
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
{
/* Configuration Error */
Error_Handler();
}
/* Start channel 1 */
if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
{
/* PWM Generation Error */
Error_Handler();
}
}
pwm.h
#ifndef PWM_H
#define PWM_H
#ifdef __cplusplus
extern "C" {
#endif
void pwm_init(uint32_t freq);
#ifdef __cplusplus
}
#endif
#endif
38KHz测试
极限测试
x-y表示直接设置脉宽寄存器为x,周期寄存器为y,从最小值开始尝试,测试最大可输出PWM频率。 APB2最大时钟是280MHz,理论最大输出就是该频率。
0-0,始终为低
1-0 输出可以看到频率是309M左右,但是可能信号驱动能力,杜邦线接线和示波器太低端所以测试不出来,但是可以看到有频率出来了 应该就是280/1M。
0-1,始终为低
1-1 280/2M,波形出不来但是可以看出频率基本正确135MHZ≈140MHz。
1-2 280/3M 波形出不来但是可以看出频率基本正确≈140MHz。
2-2 波形出不来但是可以看出频率基本正确≈93MHz。
10M 直接驱动接口设置10MHz pwm_init(10000000); 准确。
20M 直接驱动接口设置20MHz pwm_init(20000000); 频率准确,波形出不来。
40M 直接驱动接口设置40MHz pwm_init(40000000); 频率准确,波形出不来。
三.总结
可以看出PWM输出频率是非常准确的且可以非常高频输出的,受到接线和驱动能力的影响,以及示波器太低端,波形测不出来,但是频率是非常准确的。
|