📄 main.c
字号:
/*Main.c*/
/*AD采样基本程序,并带有排队滤波函数
采样结果的精度与稳定性与基准源和信号源有关
请在项目开发的时候选择稳定的电压基准源*/
#include "global.c"
#include "math.h"
void SystemInit();
void Timer1Init();
void KickDog();
void interrupt t1_int();
void SPI_Init();
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA);
void AD_Sample();
void Que();
void delay_as(unsigned int a);
int numled0=200;
unsigned int t0=0,i=0,j=0,num;
unsigned int RESULT_0=0,RESULT_L[8];
int AD0[2000],AD_0,lo[512];
unsigned int AD_FLAG=0,FLAG1,AD_GET,AD_GET1,I1,I2;
ioport port0008,port0009,port000a,port000b;
float AD_SIG0=0.0,AD_SIG8=0.0;
double sin_n;
unsigned int addr[1000];
unsigned int hh[20]={10000,13090,15878,18090,19511,20000,19511,18090,15878,13090,10000,
6910,4122,1910,489,0,489,1910,4122,6910};
unsigned int hh1[20];
unsigned char busy,flag_t1;
/*********************************************************************/
void main(void)
{
SystemInit(); //系统初始化
Timer1Init();
for(i=0;i<256;i++)
{
lo[i]=100*cos((2*3.1415926*i)/256);
}
for(i=0;i<300;i++)
{
AD0[i]=0;
}
MCRA=0x0003; //IOPA2-7,B0-7设为IO口模式
i=0;
ADCTRL1=0x4000; // ADC模块复位 reset
asm(" NOP ");
ADCTRL1=0x0020; // 自由运行,启动/停止模式,双排序器工作模式 3
// ADCTRL1 =0x0060; // 自由运行,cont,双排序器工作模式 3
MAXCONV=0x0008; //max channal number
CHSELSEQ1=0x3210; //第0通道
CHSELSEQ2=0x7654; //第0通道
ADCTRL2=0x4000; //复位使排序器指针指向CONV00
ADCTRL2=0x2000; // 启动ADC转换
PADATDIR=0xE808; //PA3,5,6,7输出,PA3=1;P5,6,7=0,选择AV0到AD模块
port0008=0xfe;
//6个灯循环亮
while(1)
{
port0008=0x00fe;
delay_as(1);
port0008=0x00fd;
delay_as(1);
port0008=0x00fb;
delay_as(1);
port0008=0x00f7;
delay_as(1);
port0008=0x00ef;
delay_as(1);
port0008=0x00df;
delay_as(1);
port0008=0x00bf;
delay_as(1);
port0008=0x007f;
delay_as(1);
}
//内部16路AD采样
while(1)
{ // PADATDIR=PADATDIR & 0xFFFE; //IOPA0=0;LED灭
// PADATDIR=PADATDIR |0x0101; //IOPA0=1;LED亮
if(i>512)
{
i=0;}
//AD0[i++]=RESULT_0;
// T1CNT=0;
EVAIFRA=0x80;
}
}
void SystemInit()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
// SCSR1=0x87FE; /* 系统时钟CLKOUT=20*2=40M PLL=1*clk*/
// SCSR1=0x83FE; /* 系统时钟CLKOUT=20*2=40M */
SCSR1=0x81FE; /* 系统时钟CLKOUT=6*4=40M */
/* 打开ADC,EVA,EVB,CAN和SCI的时钟*/
WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */
// KickDog(); /* 初始化看门狗 */
IFR=0xFFFF; /* 清除中断标志 */
IMR=0x0002; /* 打开中断2*/
WSGR=0X00; // 禁止所有的等待状态
}
void Timer1Init()
{
EVAIMRA=0x0080; // 定时器1周期中断使能
EVAIFRA=0xFFFF; // 清除中断标志
GPTCONA=0x0000;
// T1PR=2500; // 定时器1初值,定时0.4us*2500=1ms
T1PR=30;
T1CNT=0; //clear T1
T1CON=0x140C; //增模式, TPS系数40M/16=2.5M,T1使能;24M/16=1.5M
// T1CON=0x144E; //增模式, TPS系数20M/1=20M,T1使能
// KickDog(); /* 初始化看门狗 */
}
void interrupt nothing()
{
asm(" CLRC INTM ");
return;
}
void interrupt t1_int()
{
port000b=hh1[i];
PBDATDIR=0xffdf; //PB5=0(LDAC= 0).
PBDATDIR=0xffff; //PB5=1(LDAC=1).
i++;
if(i>19)
i=0;
EVAIFRA=EVAIFRA&0X0080; // 清除定时器1周期中断标志,否则以后的中断将被忽略
T1CNT=0X00; // 定时器1的计数器重新赋0
return; // 中断返回
}
void KickDog() /*踢除看门狗 */
{
WDKEY=0x5555;
WDKEY=0xAAAA;
}
void delay_ams(unsigned int a)
{
while(a-->0)
{
for(i=0;i<10;i++)
{
for(j=0;j<21;j++);
}
}
}
void delay_as(unsigned int a)
{
while(a-->0)
{
for(i=0;i<10000;i++)
{
for(j=0;j<70;j++);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -