IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32笔记:脉冲宽度计 单输入捕获+中断方式 -> 正文阅读

[嵌入式]STM32笔记:脉冲宽度计 单输入捕获+中断方式

本文介绍如何用STM32F107VC(Waveshare Open107V实验板)实现高精度的脉冲宽度计(占空比)。

开发环境:

IDE:STM32CubeIDE 1.8

固件库:STM32Cube_FW_F1_V1.8.4

函数发生:RIGOL DG5072函数信号发生器,产生0-3.3V的方波,10KHz

硬件:Waveshare Open107V,STM32F107VC, 晶振25MHz,工作频率72MHz

思路:

*利用定时器的输入捕获功能测量方波的占空比,时钟为系统时钟72MHz。

*将Channel 1 (CH1)设为上升沿捕获,信号同时输入到CH1

*启用CH1输入捕获中断,在中断产生时,切换上升沿出发或下降沿触发,在信号上升沿,CH1的比较寄存器自动获得当前计数值,存入数组tcBuf[0][n],随后切换为下降沿触发,在信号下降沿,CH1的比较寄存器自动获得当前计数值,存入tcBuf[1][n].

*用TIM2定时中断,每1秒钟计算一次脉冲宽度、频率值和占空比,发送到串口1。使用一组数据即可,或者可以多组取平均,或者进行滤波以提高精度。

*在串口1收到"DATA"指令时,停止全局中断,将tcBuf[0][0...1023]和tcBuf[1][0...1023]依次发回计算机。然后开启全局中断,继续。

测试结果:

占空比(%)脉冲宽度(us)频率(Hz)误差(%)
50.007?50.000?10001.389?0.014?
50.014?50.014?10000.000?0.028?
50.014?50.014?10000.000?0.028?
49.993?50.000?9998.611?0.014?
50.000?50.000?10000.000?0.000?
50.014?50.014?10000.000?0.028?
50.014?50.014?10000.000?0.028?
49.993?50.000?9998.611?0.014?
50.000?50.000?10000.000?0.000?

注意:
? ? ? ? *对于1kHz以下的频率,一个周期超过了一次TIM1(16bit)的计数,需要进行更为复杂的处理。
? ? ? ? *频率越高,精度越低。
? ? ? ? *10kHz信号的理论分辨率:1/7200 * 100% = 0.014%,实验结果符合的很好。

? ? ? ? *另外,占空比接近100%的时候,测量结果是不可靠的。相比之下,DMA方式更为可靠。

? ? ? ? 为什么?请热烈讨论。。。

关键代码:??

//全局变量
uint16_t tcBuf[2][BUF_SIZE] = {0};
volatile uint8_t polarity = 0;
volatile uint16_t tcBufEnd = 0;

//TIM CH1 输入捕获中断响应


void HAL_TIM_IC_CaptureCallback( TIM_HandleTypeDef *  htim )
{
	//if(htim->Instance == htim1.Instance)
	if(SET == __HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1))
	{
		//BSP_LED2_Toggle();
		//only Channel 1 is enabled, if there is any other actions, more judgments should be done here.
		if(0 == polarity)	//Rising edge
		{
			 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
			 tcBuf[0][tcBufEnd] = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1);
			 polarity = 1;
		}
		else				//Falling edge
		{
			 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
			 tcBuf[1][tcBufEnd] = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1);
			 polarity = 0;
			tcBufEnd++;
			if(tcBufEnd >= BUF_SIZE) tcBufEnd = 0;
		}
	}
}

//计算脉冲宽度,频率和占空比

/* USER CODE BEGIN 4 */
void GetPWM(void)
{
	uint16_t lenPulse = 0, lenPeriod;
	float pr = 0;
	lenPeriod = (tcBuf[0][1] > tcBuf[0][0]) ?  (tcBuf[0][1] - tcBuf[0][0]) : (0xFFFF - tcBuf[0][0] + tcBuf[0][1]);
	lenPulse =  (tcBuf[1][0] > tcBuf[0][0]) ?  (tcBuf[1][0] - tcBuf[0][0]) : (0xFFFF - tcBuf[0][0] + tcBuf[1][0]);
	if(lenPeriod != 0)
	{
		if(lenPulse > lenPeriod)
		{
			lenPulse = 0xFFFF - lenPulse;
			pr = 100.0f - (float)lenPulse * 100.0f / lenPeriod;
		}
		else pr = (float)lenPulse * 100.0f / lenPeriod;

		printf("Duty Ratio: %.3f\n", pr);

		pr = (float)lenPulse / 72.0f;

		printf("Pulse width: %.3f us\n", pr);

		pr = 72000000.0f / lenPeriod;

		printf("Period: %.1f Hz\n\n", pr);
	}
	else printf("Period: 0 Hz. No Input?? \n\n");
}

详细代码,请参考:


脉冲宽度计(占空比)单输入捕获+中断方式(STM32+CubeIDE+HAL)-硬件开发文档类资源-CSDN下载

DMA方式请参考:

STM32笔记:高精度脉冲宽度计 双输入捕获+DMA方式_st01lsp的专栏-CSDN博客

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:46:36  更:2022-02-01 20:47:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:27:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码