⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 uc/os运行在tms320lf2407a上
💻 C
字号:

/*********************************************************************************
*******************************************************************************
*/
#include "math.h"
#include "values.h"
#include "includes.h" 
#include "global.c"    
#include "lcd_menu.h"

OS_STK TaskStk[2][128];   /*任务堆栈*/
OS_EVENT *pTask1MailBox;
OS_EVENT *pTask2MailBox;  /*消息邮箱*/ 
void LedTask1(void *data);
void LedTask2(void *data); 
unsigned char num=0;
unsigned char cstring[10];
unsigned int ADRESULT[64],samp_cnt,samp_end;
double Virtual,Angle;
unsigned int *padua;
unsigned int pwave;
double A,B;
/*主程序*/
main()                 
{ 
    SystemInit();   
    MCRA=MCRA&0xFEFF;                 
    MCRB = 0xFE00;                     /* group B pins */
    MCRC = 0x0001;                     /* group C pins */
    PFDATDIR=0x0000;
   	asm(" NOP ");
//    PBDATDIR=0x0100;
    PBDATDIR=0xFFFF;
   // vInitSpiBus(); 
    OSInit();                         
    pTask1MailBox = OSMboxCreate((void*)0);
    pTask2MailBox = OSMboxCreate((void*)0);   /*    建立消息邮箱 */
    OSTaskCreate(LedTask1,(void*)0,(void*)&TaskStk[0][20],10);
    OSStart();        					/*启动系统*/
}
void LedTask1(void *data)
{
	INT8U count=0;	
	INT8U error;
	data=data;

    vLcdReset();
	vLcdWriteMenu((unsigned int *)au16MenuMesaBitmap);
    vLcdRefreshAll();

	OSTickInit();   
	OSStatInit();
    OSTaskCreate(LedTask2,(void*)0,(void*)&TaskStk[1][20],20);

	while(1)
	{
	   for(count=0;count<10;count++)
	   {
	   	 OSMboxPost(pTask1MailBox,(void*)&count);
	   	 OSMboxPend(pTask2MailBox,0,&error);
	   	 PBDATDIR=0xFF01;               /*置高,灯亮*/ 

		//vLcdSwithMenu(0);
		//vLcdSwithMenu(1);
		if(0)// (samp_end == 1)
		{
			vLcdClear();
			DFT();
			pwave = (unsigned int)(Angle/(2*PI/64));
			vDrawGraph();
//
			vValToDec(cstring, OSCPUUsage, "");
			vLcdWriteText(cstring, 5, 64);
			vValToDec(cstring, (unsigned int)Virtual, "");
			vLcdWriteText(cstring, 6, 64);
			vValToDec(cstring, pwave, "");
			vLcdWriteText(cstring, 7, 64);
			
			samp_cnt = 0;
			samp_end = 0;
			padua = &ADRESULT[0];
			ADSOC();
		}

	   	 OSTimeDlyHMSM(0,0,0,500);     

	   }
	}
} 
void LedTask2(void *data)
{
    INT8U *count;
    INT8U error; 
    data=data;

	ADINIT( );	// AD初始化子程序
	samp_cnt = 0;
	samp_end = 0;
	padua = &ADRESULT[0];
	ADSOC( );	// 启动AD转换

    while(1)
    {
        nn=15;
        count=(INT8U*)OSMboxPend(pTask1MailBox,0,&error);
      				/*等待第一个邮箱中的消息并返回消息*/   
      	nn=*count;

		PBDATDIR = (PFDATDIR & 0x00FF) | 0XFF00;               /*置高,灯亮*/ 

    	vLcdRefreshAll();

    	OSTimeDlyHMSM(0,0,0,500);			
    	OSMboxPost(pTask2MailBox,(void*)&count);  
    }
} 
 
void c_int1()
{
    *padua = RESULT0 >> 6; 	// 把AD转换的结果左移6位后存入规定的数组
	padua++;
	samp_cnt++;
	if (samp_cnt >= 64)
	{
		ADEOC();					//停止定时器1的计数,不触发ADC
		samp_end = 1;
	}
   	ADCTRL2=ADCTRL2|0X4200;			// 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
	asm(" CLRC INTM ");
}

void c_int2()
{
	unsigned int count=0;
	if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0;   
	OSTimeTick();
	OSIntEnter();  
//	OSMboxPost(pAdQMbox,(void*)&count); 
	EVAIFRA=0x80; 
	OSIntExit();
    asm(" CLRC	INTM ");
	
}
		
void interrupt phantom_isr()
{
	return;
}


void vDrawGraph()
{
	unsigned int i;
	unsigned long au32LineData[32] = {0x00000080, 0x00000040,0x00000020,0x00000010,
                               	  0x00000008, 0x00000004,0x00000002,0x00000001,
                                  0x00008000, 0x00004000,0x00002000,0x00001000,
                                  0x00000800, 0x00000400,0x00000200,0x00000100,
                                  0x00800000, 0x00400000,0x00200000,0x00100000,
                                  0x00080000, 0x00040000,0x00020000,0x00010000,
                                  0x80000000, 0x40000000,0x20000000,0x10000000,
                                  0x08000000, 0x04000000,0x02000000,0x01000000};

	unsigned long *pu32LineData;

    /* Fill in data */
    for (i = 0; i < 64; i++)
    {
        pu32LineData = &au32LineData[0] + ADRESULT[(i+64-pwave)%64]/32;

  //		au16GraphBitmap[i] = (unsigned int)((*(unsigned long *)pu32LineData & 0xff000000) >> 24);
	//	au16GraphBitmap[i+128] = (unsigned int)((*(unsigned long *)pu32LineData & 0x00ff0000) >> 16);
	//	au16GraphBitmap[i+256] = (unsigned int)((*(unsigned long *)pu32LineData & 0x0000ff00) >> 8);
	//	au16GraphBitmap[i+384] = (unsigned int)(*(unsigned long *)pu32LineData & 0x000000ff);
    }

    /* Write bitmap to shadow memory */
    //vLcdWriteMenu((unsigned int *)au16GraphBitmap);
}


//////////////////////////////////////////////////////////DFT///////////////////////////////////////////////////////
void DFT() //array[num]表示一个周波采得的离散点,num表示一个周波内的离散点数
{    
    unsigned int i;
	double sa;
//	double A,B;

	A = 0;
	B = 0;

    for(i = 0; i < 64; i++)
    {
		sa = (double)(ADRESULT[i]);
    	A = A + sa * sin(i*2*PI/64 );
    	B = B + sa * cos(i*2*PI/64 );
    }
	A = 2*A/64;
	B = 2*B/64;

	//计算基波有效值
	Virtual = sqrt((A*A + B*B)/2);		
    //计算基波相角
    if(A >= 0)
    { 
        if(B < 0)
        {
            Angle = 2*PI - atan((0-B)/A);
        }
        else if(B >= 0)
        {
            Angle = atan(B/A);    
        }
        else {}
    }
    if(A < 0 ) 
    { 
    	if(B < 0)
    	{
    	    Angle = atan((0-B)/(0-A)) + PI;
    	}
    	else if(B >= 0) 
        {
            Angle = PI - atan(B/(0-A)) ;
        }
        else {}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -