注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
Linchpin的个人空间 https://home.eeworld.com.cn/space-uid-525682.html [收藏] [复制] [分享] [RSS]
日志

【TIVA C Launchpad 学习笔记二】利用定时器的计时捕获模式制作简易频率计

已有 2582 次阅读2014-6-15 10:59 |个人分类:TIVA C Launchpad 学习笔记一

/*******************************************
开发坏境:CCSv5
程序功能:利用定时器的计时捕获模式制作简易频率计
程序说明:可测方波频率,其它波形应先整形成方波再测频率。最高和最低可测频率
                 为1HZ-100KHZ(很久前测的,现在记不太清了,差不多就是这个范围,
                 具体以实际测量为准)
编程者:Linchpin
********************************************/
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#include "driverlib/fpu.h"
#include "driverlib/sysctl.h"
#include "grlib/grlib.h"
#include "driverlib/adc.h"
#include "inc/hw_gpio.h"
#define uchar unsigned char
#define uint unsigned int
//16位捕获引脚PB6,32位捕获引脚PC4
void delay_Nms(uint n);
void Ini_Lcd(void);
void write_com(uchar com);
void write_dat(uchar dat);
uchar const disps[]={"波的频率为:"};

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
        //5分频,使用PLL,外部晶振16M,system时钟源选择 main osc。系统时钟40MHZ
    SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER0);
            //使能TIMER0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        //使能GPIOF和GPIOC外设
        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
        GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
        GPIOPinConfigure(GPIO_PC4_WT0CCP0);    //#define GPIO_PC4_WT0CCP0   0x00021007
        GPIOPinTypeTimer(GPIO_PORTC_BASE, GPIO_PIN_4);
    TimerConfigure(WTIMER0_BASE,TIMER_CFG_A_CAP_TIME_UP|TIMER_CFG_SPLIT_PAIR);//计时捕获模式,上升沿捕获
        TimerControlEvent(WTIMER0_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);
        IntEnable(INT_WTIMER0A);
        //使能TIMER0A
        TimerIntEnable(WTIMER0_BASE, TIMER_CAPA_EVENT);
        //定时器A捕获事件触发中断
        IntMasterEnable();
    //master interrupt enable API for all interrupts
        TimerEnable(WTIMER0_BASE, TIMER_A);
    //TIMER0A开始计数,当计数值等于TimerLoadSet,触发中断
    while(1)
        {
        }
}

void WTimer0IntHandler(void)
{

        uchar c[10],d[3],flag=0;
        long int t[12],j;
        double f,time=0;
        int i=0;

        TimerIntClear(WTIMER0_BASE, TIMER_CAPA_EVENT);
    t=TimerValueGet64(WTIMER0_BASE);
        i++;
        time=labs(t[1]-t[0]);
    if(i==2) {i=0;}
        flag++;
        if(flag==3)//显示
        {
                f=40000000.0/time;
                int a,aa,bb,m=0,k=0;
                double b;
                a= (int)f;//a= 1234
                b= f - a;//b= 0.5678
                for(j=a;j>0;j=j/10)
                {
                        c[k++]=j%10;
                }
                bb=(int)(b*1000);

                for(j=bb;m<3;j=j/10)
                {
                        d[m++]=j%10;
                }

                Ini_Lcd();
                for(aa=0;aa<12;aa++)
                {
                         write_dat(disps[aa]);
                }
                write_com(0x90);
                for(j=k-1;j>=0;j--)
                {        write_dat(c[j]+48);}
                write_dat('.');
                for(j=2;j>=0;j--)
                {        write_dat(d[j]+48);}
                write_dat('H');
                write_dat('Z');
    }

}



/*******************************************
函数名称:delay_Nms
功    能:延时N个ms的时间
参    数:无
返回值  :无
********************************************/
void delay_Nms(uint n)
{
    uint i = 0;
    for(i = n;i > 0;i--)
            SysCtlDelay(SysCtlClockGet() / 3000);
}
/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Ini_Lcd(void)
{
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
        GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                        GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
    delay_Nms(15);                     //延时等待液晶完成复位
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
        delay_Nms(5);
        write_com(0x30);  /*功能设置:一次送8位数据,基本指令集*/

        delay_Nms(1);
    write_com(0x08);  /*DDRAM地址归位*/
        delay_Nms(1);
        write_com(0x0c);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
        delay_Nms(1);
        write_com(0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
        delay_Nms(1);
        write_com(0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
        delay_Nms(5);
        write_com(0x80);
}

/**************************************************
*名称:void write_com(uchar com)
*功能:向1602写指令
*入口参数:com
*出口参数:无
**************************************************/
void write_com(uchar com)
{
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3, 0x00000);//RS=0,RW=0
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                        GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com);    //PB=com
        delay_Nms(5);
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4);   //E=1
    delay_Nms(5);
    GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0x00000);   //E=0
}

/**************************************************
*名称:void write_dat(uchar dat)
*功能:向1602写数据
*入口参数:dat
*出口参数:无
**************************************************/
void write_dat(uchar dat)
{
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2 );//RS=1,RW=0
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
                                GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat);  //PB=dat
        delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4);   //E=1
        delay_Nms(5);
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4);   //E=0
}

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册