561|1

504

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【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输出频率是非常准确的且可以非常高频输出的,受到接线和驱动能力的影响,以及示波器太低端,波形测不出来,但是频率是非常准确的。

 

最新回复

40MHz 的波形都测不出来的话确实可以考虑换示波器了   详情 回复 发表于 2023-12-12 07:33
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

40MHz 的波形都测不出来的话确实可以考虑换示波器了

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表