单片机频率测量一直变化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机频率测量一直变化相关的知识,希望对你有一定的参考价值。
参考技术A 单片机应用系统中,经常要对一个连续的脉冲波频率进行测量。在实际应用中,对于转速,位移、速度、流量等物理量的测量,一般也是由传感器转换成脉冲电信号,采用测量频率的手段实现。使用单片机测量频率或周期,通常是利用单片机的定时计数器来完成的,测量的基本方法和原理有两种:
测频法:在限定的时间内(如1秒钟)检测脉冲的个数。
测周法:测试限定的脉冲个数之间的时间。
这两种方法尽管原理是相同的,但在实际使用时,需要根据待测频率的范围、系统的时钟周期、计数器的长度、以及所要求的测量精度等因素进行全面和具体的考虑,寻找和设计出适合具体要求的测量方法。
在具体频率的测量中,需要考虑和注意的因素有以下几点。
ü 系统的时钟。首先测量频率的系统时钟本身精度要高,因为不管是限定测量时间还是测量限定脉冲个数的周期,其基本的时间基准是系统本身时钟产生的。其次是系统时钟的频率值,因为系统时钟频率越高,能够实现频率测量的精度也越高。因此使用AVR测量频率时,建议使用由外部晶体组成的系统的振荡电路,不使用其内部的RC振荡源,同时尽量使用频率比较高的系统时钟。
ü 所使用定时计数器的位数。测量频率要使用定时计数器,定时计数器的位数越长,可以产生的限定时间越长,或在限定时间里记录的脉冲个数越多,因此也提高了频率测量的精度。所以对频率测量精度有一定要求时,尽量采用16位的定时计数器。
ü 被测频率的范围。频率测量需要根据被测频率的范围选择测量的方式。当被测频率的范围比较低时,最好采用测周期的方法测量频率。而被测频率比较高时,使用测频法比较合适。需要注意的是,被测频率的最高值一般不能超过测频MCU系统时钟频率的1/2,因为当被测频率高于MCU时钟1/2后,MCU往往不能正确检测被测脉冲的电平变化了。
STC15单片机PWM实际波形测量
STC15单片机PWM实际波形测量
本实验跑的官方PWM示例
- 官方示例代码下载位置: https://www.stcmcudata.com/
- 示例8:
主程序注释掉了增量变化
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* --- QQ: 800003751 ----------------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include "config.h"
#include "PCA.h"
#include "delay.h"
/************* 功能说明 **************
输出3路9~16位变化的PWM信号。类似"呼吸灯"的驱动.
PWM频率 = MAIN_Fosc / PWM_DUTY, 假设 MAIN_Fosc = 24MHZ, PWM_DUTY = 6000, 则输出PWM频率为4000HZ.
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
u16 pwm0,pwm1,pwm2;
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
void PCA_config(void)
{
PCA_InitTypeDef PCA_InitStructure;
PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse = PCA_P12_P11_P10_P37; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Polity = PolityHigh; //优先级设置 PolityHigh,PolityLow
PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //对于软件定时, 为匹配比较值
PCA_Init(PCA0,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //对于软件定时, 为匹配比较值
PCA_Init(PCA1,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //对于软件定时, 为匹配比较值
PCA_Init(PCA2,&PCA_InitStructure);
}
/******************** task A **************************/
void main(void)
{
P2M1 &= ~(0xe0); //P2.7 P2.6 P2.5 设置为推挽输出
P2M0 |= (0xe0);
PCA_config();
pwm0 = (PWM_DUTY / 4 * 1); //给PWM一个初值
pwm1 = (PWM_DUTY / 4 * 2);
pwm2 = (PWM_DUTY / 4 * 3);
PWMn_Update(PCA0,pwm0);
PWMn_Update(PCA1,pwm1);
PWMn_Update(PCA2,pwm2);
EA = 1;
while (1)
{
delay_ms(2);
//if(++pwm0 >= PWM_HIGH_MAX)
pwm0 = PWM_HIGH_MAX;//设置为最大
PWMn_Update(PCA0,pwm0);
//if(++pwm1 >= PWM_HIGH_MAX)
pwm1 = PWM_HIGH_MIN;
PWMn_Update(PCA1,pwm1);
//if(++pwm2 >= PWM_HIGH_MAX)
pwm2 = PWM_HIGH_MIN;
PWMn_Update(PCA2,pwm2);
}
}
- 示波器测得
P1.1
的脉宽波形,如下:
- 示波器测得
P3.7
的脉宽波形,如下:
- 由于
P1.0
IO口与GND相同了,测不到波形。
以上是关于单片机频率测量一直变化的主要内容,如果未能解决你的问题,请参考以下文章
急求正弦波转为方波的方法(利用单片机测1Hz~3MHz的正弦波)