📄 main.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 + -