当前位置: 首页 > news >正文

wordpress表格自适应seo入门免费教程

wordpress表格自适应,seo入门免费教程,私密浏览器如何下载视频,建筑工程app目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…

目录

一、脉冲模块

(1)资源介绍

        🔅原理图

        🔅采集原理

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、脉冲模块接口函数封装

三、踩坑日记

(1)中断使能

(2)引脚配置

(3)ADC校准


一、脉冲模块

(1)资源介绍

        🔅原理图

        蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;

图1        拓展接口

        脉冲模块电路原理图如下所示:

图2        脉冲模块电路原理图

         通过两张电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
PULSEMCU
PR1PB1
PULSPB0
LED1PB7
LED2PB6

        🔅采集原理

        脉冲信号由脉冲芯片产生,通过PR3滑动变阻器控制,不同阻值下的脉冲频率不同。

        通过公式可得,脉冲频率 = 脉冲周期的倒数,那么我们可以将问题转换为求取脉冲周期。

f=\frac{1}{T}

        PULS连接在PB0引脚,该引脚为定时器3的通道3,我们可以使用定时器的输入捕获模式(Input Capture direct mode)。捕获脉冲的上升沿,通过计算相邻两个上升沿之间的差值,即可得到该脉冲的周期。示意图如下所示:

图3        脉冲示意图

       ⚠️注意:由于定时器周期不为1Hz,所以这里需要用定时器时钟频率除以脉冲周期

        定时器的计数寄存器为16位,范围是0~65535,溢出后清零重新计数。在计算脉冲周期时会遇到三种情况,如图4所示:

图4        计数不同情况

        对于情况3,如果两次获取的值相等,需要考虑是否为定时器计数异常等情况,所以一般判为error

🟠️伪代码如下:

if(第一个上升沿)
{cnt1 = 获取定时器cnt值;
}
else if(第二个上升沿)
{cnt2 = 获取定时器cnt值;/* 判断情况 */if(cnt2 > cnt1)脉冲周期 = cnt2 - cnt1;else if(cnt2 < cnt1)脉冲周期 = 0xFFFF - cnt1 + 1 + cnt2;elseerror报错;uwFreq = 定时器时钟频率 / 脉冲周期;
}

        PR1为AD采集,参考之前的文章即可:

【蓝桥杯——物联网设计与开发】拓展模块2 - 电位器模块_lowpowerautowait-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/139212183?spm=1001.2014.3001.5501

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502

1️⃣点击引脚 PB0 → 选择 TIM3_CH3 ;(此时引脚呈黄色,因为TIM还未配置)

2️⃣点击 "Timers" → 点击"TIM3" → 将 "Channel3" 栏修改为 "Input Capture direct mode",即将 PB0 引脚配置为TIM3通道3的输入捕获模式;(此时引脚呈绿色,可以正常工作)

⚠️注意:下方参数表中:

  1. 计数周期为65535
  2. 通道3输入捕获极性为上升沿下降沿
图5        引脚配置


3️⃣配置PB1引脚为AD采集引脚;(具体参考AD采集一文)

4️⃣初始化 OLED;(具体参考OLED一文)

5️⃣生成代码即可;

(3)代码编写

🟢️main 函数

/* USER CODE BEGIN PV */
uint8_t puc_oled[17];    // oled显示缓存区
uint16_t pui_adc;        // adc采集值uint8_t uc_ic_state;     // 输入捕获状态,区分第一次和第二次上升沿
uint32_t uwValue1;       // 第一次上升沿的计数值
uint32_t uwValue2;       // 第二次上升沿的计数值
uint32_t uwDiff;         // 脉冲周期
uint32_t uwFreq;         // 脉冲频率
/* USER CODE END PV *//* USER CODE BEGIN 0 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)                    // 判断是否为通道3中断{if(uc_ic_state == 0)    // 第一次上升沿{uwValue1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值uc_ic_state = 1;    // 修改状态变量}else if(uc_ic_state == 1)    // 第二次上升沿{uwValue2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值/* 判断情况 */if(uwValue2 > uwValue1)    uwDiff = uwValue2 - uwValue1;else if(uwValue2 < uwValue1)uwDiff = 0xFFFF - uwValue1 + 1 + uwValue2;elseError_Handler();uwFreq = HAL_RCC_GetPCLK1Freq() / uwDiff;    // 计算脉冲频率uc_ic_state = 0;    // 修改状态变量}}
}
/* USER CODE END 0 */
/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 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();MX_ADC_Init();MX_TIM3_Init();MX_I2C3_Init();/* USER CODE BEGIN 2 */OLED_Init();HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);    // 开启定时器捕获中断/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* ADC采集 */HAL_ADC_Start(&hadc);if(HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK)pui_adc = HAL_ADC_GetValue(&hadc);/* OLED显示 */sprintf((char*)puc_oled, "TIM:%u     ", uwFreq);OLED_ShowString(0, puc_oled);sprintf((char*)puc_oled, "ADC:%.2f   ", pui_adc * 3.3 / 4095);OLED_ShowString(2, puc_oled);HAL_Delay(200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

  •         旋转PR1按钮,能够实时采集AD值;
  •         旋转PR3按钮,能够实时采集频率值;

二、脉冲模块接口函数封装

🟡️定时器输入捕获中断函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)                    // 判断是否为通道3中断{if(uc_ic_state == 0)    // 第一次上升沿{uwValue1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值uc_ic_state = 1;    // 修改状态变量}else if(uc_ic_state == 1)    // 第二次上升沿{uwValue2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值/* 判断情况 */if(uwValue2 > uwValue1)    uwDiff = uwValue2 - uwValue1;else if(uwValue2 < uwValue1)uwDiff = 0xFFFF - uwValue1 + 1 + uwValue2;elseError_Handler();uwFreq = HAL_RCC_GetPCLK1Freq() / uwDiff;    // 计算脉冲频率uc_ic_state = 0;    // 修改状态变量}}
}

三、踩坑日记

(1)中断使能

        🔅中断使能应该使用函数HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);否则中断无法进入;

(2)引脚配置

        🔅引脚模式配置为带上拉电阻(目前没发现不配置有什么问题);

        🔅速度配置为Very High

(3)ADC校准

        🔅ADC模块注意:初始化函数里面需要进行ADC校准,否则无法测量准确的值‼️

http://www.hkea.cn/news/692088/

相关文章:

  • 会宁网站建设公司网站优化助手
  • 网站设计制作体会2023年5月最新疫情
  • 月亮湾设计有限公司网站南宁seo产品优化服务
  • 福田欧曼服务站电话上海高端seo公司
  • 高端网站建设哪家好谷歌seo和百度seo
  • 前端写一个页面多少钱海口网站关键词优化
  • 浦东新区建设局官方网站东莞seo关键词
  • 在百度做橱柜网站进入百度一下官网
  • wordpress调用分类标签站长工具查询seo
  • 网站做全局搜索云南新闻最新消息今天
  • 公司网站推广方案长春seo代理
  • 网站地图怎么样做更利于收录手机百度搜索引擎入口
  • 中国建筑公司网站谷歌浏览器官方app下载
  • 厦门网站建设策划seo网站优化培训找哪些
  • 宝安区住房和建设局官方网站seo搜索引擎优化书籍
  • 省建设厅执业资格注册中心网站2023搜索最多的关键词
  • 本地wordpress上传搜索引擎营销优化策略有哪些
  • html手机网站模板培训心得体会800字
  • 合肥做网站公司哪家好经典的软文广告
  • 网站备案哪个部门北京推广
  • 澳环网站设计公司网站建设方案
  • 云南旅行社网站建设网络推广有多少种方法
  • 龙岗做商城网站建设网络营销战略的内容
  • 网站建设网络公整站排名
  • 南昌购物网站制作软文广告成功案例
  • 鞍山找工作哪个网站最靠谱千度搜索引擎
  • 济南做网站互联网公司英文seo推广
  • 给企业做网站的公司品牌整合营销传播
  • 互联网技术应用学什么杭州优化建筑设计
  • 重庆网站建设要点襄阳seo优化排名