📄 oscillograph_v2.c
字号:
/****************************************************************************************
* 文 件 名:main.c
* 功 能:通过图形函数接口,演示矩形波的傅立叶逼近过程
* 说 明:将JP3短接。
****************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "math.h"
#define PI 3.1415
#define TaskStkLengh 512
#define K 0.03
OS_STK TaskStk0 [TaskStkLengh];
OS_STK TaskStk1 [TaskStkLengh];
/********采样的变量定义**********/
uint32 ADC_DATA1[200]={0};
uint32 ADC_DATA[200]={200,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; //存放转换结果
uint32 ADC_DATA_AVG=3000; //存放平均值
uint32 COU=0; //下标
volatile uint32 count=0;
volatile uint32 maxwell=0; //采样显示数组的下标
uint32 ADC_DATA_AV[100]={0}; //存储采样显示数据的数组
/***********************************/
OS_EVENT *Mybox; //定义消息邮箱
/**********************************
void Line_MySIN(void)
{
uint32 x,y;
for(x=0;x<320;x++)
{
y=(100-95*sin(x*PI/120));
//y=10;
GUI_Point(x,y,RED);
}
}
**********************************/
/**********************************/
void Line_MySIN(void)
{
uint32 x,y;
for(x=0;x<200;x++)
{
y=(100-95*ADC_DATA[x]/3300);
//y=10;
GUI_Point(x,y,RED);
}
}
/**********************************/
/****************************************************************************
* 功 能:初始化背景和坐标系
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Coordinate(void)
{
GUI_FillSCR(BLUE); // 填充白色背景
GUI_HLine( 0, 0, 319, YELLOW); // 绘画x坐标轴
GUI_HLine( 0, 20, 319, YELLOW);
GUI_HLine( 0, 40, 319, YELLOW);
GUI_HLine( 0, 60, 319, YELLOW);
GUI_HLine( 0, 80, 319, YELLOW);
GUI_HLine( 0, 100, 319, YELLOW);
GUI_HLine( 0, 120, 319, YELLOW);
GUI_HLine( 0, 140, 319, YELLOW);
GUI_HLine( 0, 160, 319, YELLOW);
GUI_HLine( 0, 180, 319, YELLOW);
GUI_HLine( 0, 200, 319, YELLOW);
GUI_HLine( 0, 220, 319, YELLOW);
GUI_HLine( 0, 240, 319, YELLOW);
GUI_RLine(0, 0, 240, YELLOW); // 绘画y坐标轴
GUI_RLine(20, 0, 240, YELLOW);
GUI_RLine(40, 0, 240, YELLOW);
GUI_RLine(60, 0, 240, YELLOW);
GUI_RLine(80, 0, 240, YELLOW);
GUI_RLine(100, 0, 240, YELLOW);
GUI_RLine(120, 0, 240, YELLOW);
GUI_RLine(140, 0, 240, YELLOW);
GUI_RLine(160, 0, 240, YELLOW);
GUI_RLine(180, 0, 240, YELLOW);
GUI_RLine(200, 0, 240, YELLOW);
GUI_RLine(220, 0, 240, YELLOW);
GUI_RLine(240, 0, 240, YELLOW);
GUI_RLine(260, 0, 240, YELLOW);
GUI_RLine(280, 0, 240, YELLOW);
GUI_RLine(300, 0, 240, YELLOW);
GUI_RLine(320, 0, 240, YELLOW);
}
/****************************************************************************/
/******************ADC初始化********************************************/
void ADC_Init(void)
{
PINSEL1=PINSEL1&(~(3<<22))|(1<<22); //设置P0.27为AIN0
ADCR= (1<<0) |
((Fpclk/1000000-1)<<8) |
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(1<<24) |
(0<<27);
}
/*******************************************************************************/
/*****************T1初始化******************************************************/
void T1_Init(void)
{
T1IR=0xFFFFFFFF; //清楚定时器的全部中断标志
T1TC=0x00; //初始化T1
T1PR=0x00; //不分频
T1MCR=0x03; //匹配的时候 产生中断并且复位
T1MR0=Fpclk/5000; //定时时间为200us
T1TCR=0x01; //启动定时器
}
/*******************************************************************************/
/*************中断服务程序***********************************/
void Timer1_Exception(void)
{
static uint32 Temp;
//void *Temp1=(&Temp);
OS_ENTER_CRITICAL();
T1IR=0x01; //清除中断标志
VICVectAddr=0; //通知中断控制器中断结束
/*******************采样程序*******/
Temp=ADDR;
ADCR=(ADCR&0xFFFFFF00)|0x01|(1<<24); //切换通道,并且进行转换
while((ADDR&0x80000000)==0);
ADCR=ADCR|(1<<24);
while((ADDR&0x80000000)==0);
Temp=ADDR;
Temp=(Temp>>6)&0x3FF;
Temp=3300*Temp;
Temp=Temp>>10;
/**********************************/
OS_EXIT_CRITICAL();
ADC_DATA1[count]=Temp;
OSMboxPost(Mybox,(void *)&Temp);
}
/*************计算平均值程序***********************************/
void AVG_CAL(uint32 *Data)
{
uint32 i;
uint32 Begin=0; //循环的初始值
uint32 AVG[4]={0}; //存放计算平均值的中间结果
for(i=0;i<4;i++)
{
Begin=i*50;
for(COU=Begin;COU<(Begin+50);COU++)
AVG[i]=ADC_DATA[COU]+AVG[i];
}
ADC_DATA_AVG=AVG[0]+AVG[1]+AVG[2]+AVG[3];
ADC_DATA_AVG=ADC_DATA_AVG/200;
}
/***********************显示平均值*********************************/
void AVG_Display(void)
{
AVG_CAL(ADC_DATA); //计算平均值
ZLG7290ShowChar(3,ADC_DATA_AVG/1000);
ZLG7290ShowChar(2,(ADC_DATA_AVG%1000)/100);
ZLG7290ShowChar(1,(ADC_DATA_AVG%100)/10);
ZLG7290ShowChar(0,ADC_DATA_AVG%10);
}
/**************************************************************************/
/*********************************************************************************************************
** Task1 任务1
中速采样任务
**********************************************************/
void Task1(void *pdata)
{
INT8U err=0;
uint32 i,x,y;
uint32 L=0;
count=0;
pdata=pdata;
x=0;
Mybox=OSMboxCreate((void*)0); //创建一个信邮箱
ADC_Init(); //ADC初始化
//IRQ_init(); //IRQ初始化
T1_Init(); //初始化T1
while(1)
{
for(count=0;count<200;count++) //从邮箱中读取采样的数据
{
ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));
if((count+1)%2==0)
ADC_DATA_AV[maxwell]=(ADC_DATA[count-1]+ADC_DATA[count])/2;
if(maxwell>99)
maxwell=0;
else
maxwell++;
}
//VICIntEnClr=1<<5; //禁止T1的中断
//ZLG7290ShowChar(7,0x0F); //采样完成显示“F”
/*******显示曲线******************/
while(x<318)
{
for(i=0;i<100;i++)
{
GUI_RLine(x+1, 0, 200, BLUE);
GUI_RLine(x+2, 0, 200, BLUE);
GUI_RLine(x+3, 0, 200, BLUE);
while(L<200)
{
GUI_Point(x+1, L, YELLOW );
GUI_Point(x+2, L, YELLOW );
GUI_Point(x+3, L, YELLOW );
L=L+20;
}
L=0;
if(((x+1)%20)==0)
{
GUI_RLine(x+1, 0, 200,YELLOW);
}
if(((x+2)%20)==0)
{
GUI_RLine(x+2, 0, 200, YELLOW);
}
if(((x+3)%20)==0)
{
GUI_RLine(x+3, 0, 200,YELLOW);
}
y=100-ADC_DATA_AV[i]*K; //K为电压与格子数的转换系数
GUI_Point(x,y,RED);
x=x+1;
}
}
x=0;
/*********************************/
OSTimeDly(100);
}
}
/***************************************************************************************/
/***************************************************************************
* 功 能:
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Task0(void *pdata)
{
pdata =pdata;
TargetInit();
GUI_FillSCR(WHITE); // 填充白色背景
GUI_Initialize(); // 初始化LCM
Coordinate();
BAR_FillSCR(10,120,20,140,DGREEN);
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);//中速采样任务
while(1)
{
//AVG_Display(); //显示采样的结果
OSTimeDly(1000);
//Line_My();
//OSTaskResume(2);
}
}
/****************************************************************************
* 功 能:创建任务
* 入口参数:无
* 出口参数:无
****************************************************************************/
int main(void)
{
OSInit();
OSTaskCreate(Task0,(void *)0,&TaskStk0[TaskStkLengh-1],4);
OSStart();
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -