历史上的今天
今天是:2025年02月12日(星期三)
2020年02月12日 | 基于msp430G2553的低频方波频率、占空比、峰峰值测量函数
2020-02-12 来源:eefocus
使用的平台是TI公司的launch pad,频率和占空比已经实现,峰峰值还有有待改进
1、主函数部分:
/*********************************************
* _ooOoo_ *
* o8888888o *
* 88" . "88 *
* (| -_- |) *
* O = /O *
* ____/`---'____ *
* .' \| |// `. *
* / \||| : |||// *
* / _||||| -:- |||||- *
* | | \ - /// | | *
* | _| ''---/'' | | *
* .-__ `-` ___/-. / *
* ___`. .' /--.-- `. . __ *
* ."" '< `.____<|>_/___.' >'"". *
* | | : `- `.;` _ /`;.`/ - ` : | | *
* `-. _ __ /__ _/ .-` / / *
*======`-.____`-.________/___.-`____.-'======*
* `=---=' *
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*
* No bug forever *
*********************************************/
/*
* Author: 余裕鑫
* function:测量信号的频率和占空比,信号输入管脚为P2.1.串口打印输出信息。
* 串口:9600,无校验位,8位数据位,1位停止位
* Created on: 2018年5月2日
*注意:测频率和占空比采用分别是测量一个周期和高电平期间的时钟个数,故适合于低频部分的频率和占空比的测量
* 当频率高于100Hz时,误差逐渐增大,
* 100Hz时,误差约为1%,1Hz
* 1000Hz时,误差约为1.5%,15Hz
* 10000Hz时,误差约为0.37%,37Hz
* 20000Hz时,误差约为2%,199Hz
* 30000Hz时,误差约为6.5%,650Hz
*/
#include #include "stdio.h" #include "pwminput.h" #include "uart.h" #include "datatype.h" extern volatile u16 Frequency; extern volatile u8 Duty; extern volatile u16 PeakValue; float PeakValueF; /** * main.c */ void main(void) { unsigned char str[20]; WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer // 将MCLK 和 SMCLK 设置为16MHZ,ACLK默认为32.768KHz DCOCTL = CALDCO_16MHZ; BCSCTL1 = CALBC1_16MHZ; //使用高频时钟而减小误差 _EINT(); UART_Init(); sprintf(str,"frequency and duty:n"); UARTSendString(str); while(1) { Measure_Frequency_Duty(); sprintf(str,"Frequency : %d n",Frequency); UARTSendString(str); sprintf(str,"Duty : %d n",Duty); UARTSendString(str); // Measure_Peak_Value(); // PeakValueF = PeakValue*3.6/1024; // sprintf(str,"Peak Value : %0.2f n",PeakValueF); // UARTSendString(str); __delay_cycles(50000000); } } 2、C文件部分: /* * pwminput.c * * Created on: 2018年4月23日 * Author: yyx */ #include "pwminput.h" #include "adc.h" #define T0C1A P1DIR&=~BIT2;P1SEL|=BIT2;P1SEL2&=~BIT2 #define T1C0A P2DIR&=~BIT0;P2SEL|=BIT0;P2SEL2&=~BIT0 #define T1C1A P2DIR&=~BIT1;P2SEL|=BIT1;P2SEL2&=~BIT1 #define SAMPLETIMES 10 //测峰峰值中一个周期采样的次数 #define SAMPLEPERIODS 5 //测一次峰峰值中采样的周期个数 u8 FreqFlag = 0; u16 PwmStart;//初始时间 u16 PwmHighEnd,PwmLowEnd;//高电平和低电平的结束时间 u16 HighOverFlow,AllOverFlow; //高电平和一个周期的翻转个数 u32 HighClockSteps,AllClockSteps; u16 PeakIntervalSteps; volatile u16 Frequency; volatile u8 Duty; volatile u16 PeakValue; extern volatile u16 ADC10_Result; u8 SampleStatus; //频率占空比测量函数 void Measure_Frequency_Duty(void) { T1C1A; //管脚配置p2.1 FreqFlag=1; //频率测量中断标志 TA1CCTL1 = CAP+CM_1+CCIS_0+SCS+CCIE; // 输入捕捉,上升沿触发(upCM_1,downCM_2,updownCM_3),同步捕捉,CCI0A 中断使能 TA1CTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 选择SMCLK为时钟,连续计数模式 ,溢出中断使能 while(FreqFlag); if(PwmHighEnd>PwmStart) { HighClockSteps=(HighOverFlow-1)*65536+PwmHighEnd-PwmStart; }else { HighClockSteps=(HighOverFlow-1)*65536+PwmHighEnd+65536-PwmStart; } if(PwmLowEnd>PwmStart) { AllClockSteps=(AllOverFlow-1)*65536+PwmLowEnd-PwmStart; }else { AllClockSteps=(AllOverFlow-1)*65536+PwmLowEnd+65536-PwmStart; } if(AllClockSteps) { PeakIntervalSteps = (u16)AllClockSteps/SAMPLETIMES; //测峰峰值中以10倍频率进行采样 } Frequency = 16000000/AllClockSteps; Duty = HighClockSteps*100.0/AllClockSteps; } /* * 功能:测P1.3管脚信号的峰峰值 * */ void Measure_Peak_Value(void) { if(PeakIntervalSteps) //如果采样间隔不为0 { //使用TimerA1的计数模式, TA1CTL |= TACLR; //定时器清零 TA1CTL |= TASSEL_2+ MC_1+ID_0; //SMCLK(16MHz),1分频,上数模式 //定时器开始计数从0到CCR0 TA1CCR0 = PeakIntervalSteps; //十分之一个周期中断一次 TA1CCTL0=CCIE; //使能中断 ADC10_Init(3); // 初始化ADC SampleStatus = SAMPLEPERIODS; while(SampleStatus); } } #pragma vector = TIMER1_A0_VECTOR __interrupt void TimerA1_ISR(void) { _DINT(); static u16 PeriodValue[2*SAMPLETIMES],MaxValue[SAMPLEPERIODS+1],MinValue[SAMPLEPERIODS+1]; u32 MaxSum,MinSum; static u8 i; u8 j; if(SampleStatus) { if(i<2*SAMPLETIMES) { ADC10_Start_Convey(); PeriodValue[i++] = ADC10_Result; } if(i==2*SAMPLETIMES) { i=0; MaxValue[SampleStatus]=MinValue[SampleStatus]=PeriodValue[0];//初始化最值 for(j=0;j<2*SAMPLETIMES;j++) { if(PeriodValue[j]>MaxValue[SampleStatus])MaxValue[SampleStatus]=PeriodValue[j]; if(PeriodValue[j] SampleStatus--; //测量的周期次数减1 if(SampleStatus==0)//如果采样完成 { for(j=1;j<=SAMPLEPERIODS;j++) { MaxSum+=MaxValue[j]; MinSum+=MinValue[j]; } PeakValue=(u16)(MaxSum-MinSum)/SAMPLEPERIODS; MaxSum=MinSum=0; } } } _EINT(); } #pragma vector = TIMER1_A1_VECTOR __interrupt void TimerA1_Capture_ISR(void) { _DINT(); //关闭中断, switch(TA1IV)//向量查询 { case 2: //捕获中断,CCR1 if(FreqFlag) { static u8 index; if((TA1CCTL1&CM0)&&(index==0)) //第一次上升沿 { TA1CCTL1|=CM_2;//更变为下降沿触发 PwmStart=TA1R;//记录初始时间 HighOverFlow = AllOverFlow = 0; //溢出计数变量复位
史海拾趣
|
1 前言 TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度 ...… 查看全部问答> |
|
书上说世界上信号都是模拟信号,我很奇怪,要连续的信号才是模拟信号啊,我总感觉时间不是连续的,我在想是不是任何一个信号都是由很多个正弦波组成的, 如果我对一个人发出的声音进行处理,比如说把声音放大了,那么到底放大的是什么? 网上说声 ...… 查看全部问答> |
|
我有一台多穴主机安装了vxworks系统,需要连接两个不同的子网192.168.0.0(网关为192.168.0.1)和193.1.0.0(网关为193.1.0.1)。 我通过mRouteAdd调用增加了对不同网段的静态路由表项,可是两个网段中的主机之间仍然互相不能ping同,但是都能ping通 ...… 查看全部问答> |
|
三星4510b的代码定义中为啥地址有个基址?3ff0000 #define SFR_BASE 0x3FF8000 #define INTPND (*((volatile unsigned long *) (SFR_BASE + 0x4004))) 手册上如 INTPND写的是 0x4004 另外在初始化内存时 ...… 查看全部问答> |
|
我手机用的是WINCE 5.0,无论是安装CAB版本或者是绿色版本,都会提示找不到文件(或它的某一个组件),请确认路径和文件名正确并且所需要的库全部可用。 是不是什么库没有注册,该如何注册?… 查看全部问答> |




