注册会员
- 积分
- 58
- 威望
- 40
- 贡献
- 8
- 兑换币
- 10
- 注册时间
- 2016-10-21
- 在线时间
- 5 小时
- 毕业学校
- 厦门大学
|
5#
楼主 |
发表于 2016-10-24 10:30:02
|
只看该作者
为什么加上PIT定时器模块,AD模块采样就失效呢,以下是部分程序:#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "ZX0802_002.h"
#include "18B20_002.h"
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned int AD_in1,AD_in0,AD_in3,AD_in4;
unsigned int wendu;
unsigned int zhengshu,xiaoshu;
unsigned int volt_zhengshu,volt_xiaoshu;
unsigned int strom_zhengshu,strom_xiaoshu;
float u_xiaoshu,i_xiaoshu;
signed char temperature[7]={'0','0','0','.','0','0','C'};
signed char volt[6]={'0','0','.','0','0','V'};
signed char strom[7]={'0','0','0','.','0','0','A'};
unsigned int num[9];
int i,j,n;
int pit_count,pit_flag;
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //设置OSCCLK作为系统时钟
PLLCTL &= 0x8F; //禁止锁相环
CRGINT &= 0xDF;
//PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1), fbus=PLLCLK/2
#if(BUS_CLOCK == 120000000)
SYNR = 0xcd;
#elif(BUS_CLOCK == 104000000)
SYNR = 0xcc;
#elif(BUS_CLOCK == 96000000)
SYNR = 0xcb;
#elif(BUS_CLOCK == 88000000)
SYNR = 0xca;
#elif(BUS_CLOCK == 80000000)
SYNR = 0xc9;
#elif(BUS_CLOCK == 72000000)
SYNR = 0xc8;
#elif(BUS_CLOCK == 64000000)
SYNR = 0xc7;
#elif(BUS_CLOCK == 56000000)
SYNR = 0xc6;
#elif(BUS_CLOCK == 48000000)
SYNR = 0xc5;
#elif(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#elif(BUS_CLOCK == 16000000)
SYNR = 0x01;
#endif
REFDV = 0x81;
PLLCTL |=0x70; //使能锁相环
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK锁定
CLKSEL |= 0x80; //设置PLLCLK为系统时钟
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0xff; //指定所有通道为输出比较方式
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TIE = 0x00; // 禁止所有通道定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* PIT模块初始化函数 */
/*************************************************************/
void init_PIT(){
PITCFLMT=0x00;
PITMTLD0=249; //为0通道8位计数器赋值
PITLD0=63999; //为0通道16位计数器赋值 //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0; //第0通道使用微计数器0
PITCE_PCE0=1; //第0通道计数器工作
PITCFLMT=0x80; //使能周期中断定时器
PITINTE_PINTE0=1; //0通道定时器定时中断被使能
}
/*************************************************************/
/* 计时中断函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PIT_INTER(void)
{
if(PITTF_PTF0==1) {
PITTF_PTF0=1;
pit_count++;
if(pit_count==10)
{
pit_flag=1;
pit_count=0;
}
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 初始化AD模块 */
/*************************************************************/
void INIT_AD(void)
{
ATD0CTL2 = 0x40; //启动A/D模块,快速清零,禁止中断
ATD0CTL1_SRES=2; //选用12位模数转换
ATD0CTL3 = 0x88; //每次只转换一个通道
ATD0CTL4 = 0x07; //AD模块时钟频率为8MHz
}
/*************************************************************/
/* 起动AD转换 */
/*************************************************************/
unsigned int AD_capture(unsigned char chanel)
{
unsigned int AD_data;
switch(chanel)
{
case 0:
ATD0CTL5 = 0x00; //转换AD00
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 1:
ATD0CTL5 = 0x01; //转换AD01
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 2:
ATD0CTL5 = 0x02; //转换AD02
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 3:
ATD0CTL5 = 0x03; //转换AD03
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 4:
ATD0CTL5 = 0x04; //转换AD04
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 5:
ATD0CTL5 = 0x05; //转换AD05
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 6:
ATD0CTL5 = 0x06; //转换AD06
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 7:
ATD0CTL5 = 0x07; //转换AD07
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 8:
ATD0CTL5 = 0x08; //转换AD08
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 9:
ATD0CTL5 = 0x09; //转换AD09
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 10:
ATD0CTL5 = 0x0a; //转换AD10
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 11:
ATD0CTL5 = 0x0b; //转换AD11
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 12:
ATD0CTL5 = 0x0c; //转换AD12
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 13:
ATD0CTL5 = 0x0d; //转换AD13
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 14:
ATD0CTL5 = 0x0e; //转换AD14
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
case 15:
ATD0CTL5 = 0x0f; //转换AD15
while(!ATD0STAT0_SCF);
AD_data = ATD0DR0;
break;
}
return(AD_data);
}
/************************************************************/
/* 在液晶上显示温度 */
/************************************************************/
void play_temp(void)
{
// INIT_LCD();
// lcd_clear();
lcd_string(temperature[0]);
lcd_string(temperature[1]);
lcd_string(temperature[2]);
lcd_string(temperature[3]);
lcd_string(temperature[4]);
lcd_string(temperature[5]);
lcd_string(temperature[6]);
lcd_string(32);
delay1ms(500);
}
/************************************************************/
/* 在液晶上显示电压 */
/************************************************************/
void play_volt(void)
{
lcd_string(volt[0]);
lcd_string(volt[1]);
lcd_string(volt[2]);
lcd_string(volt[3]);
lcd_string(volt[4]);
lcd_string(volt[5]);
lcd_string(32);
delay1ms(500);
}
/************************************************************/
/* 在液晶上显示电流 */
/************************************************************/
void play_strom(void)
{
lcd_string(strom[0]);
lcd_string(strom[1]);
lcd_string(strom[2]);
lcd_string(strom[3]);
lcd_string(strom[4]);
lcd_string(strom[5]);
lcd_string(strom[6]);
delay1ms(500);
}
/************************************************************/
/* 电压数值转换 */
/************************************************************/
void trans_volt(unsigned int k)
{
volt_zhengshu=k/819; //计算电压的证整数部分
u_xiaoshu=(k/819.00-volt_zhengshu)*100; //计算电压的小数部分
volt_xiaoshu=(int)u_xiaoshu;
volt[0]=volt_zhengshu/10+48; //计算电压的各位字符型
volt[1]=volt_zhengshu%10+48;
volt[3]=volt_xiaoshu/10+48;
volt[4]=volt_xiaoshu%10+48;
}
/************************************************************/
/* 电流数值转换 */
/************************************************************/
void trans_strom(unsigned int k)
{
if(k>820)
{
strom_zhengshu=(k/819.000-1)/0.0052;
i_xiaoshu=((k/819.000-1)/0.0052-strom_zhengshu)*100;
strom_xiaoshu=(int)i_xiaoshu;
strom[0]=strom_zhengshu/100+48; //计算电流的各位字符型
strom[1]=(strom_zhengshu/10)%10+48;
strom[2]=strom_zhengshu%10+48;
strom[4]=strom_xiaoshu/10+48;
strom[5]=strom_xiaoshu%10+48;
}
else
{
strom[0]=0+48; //计算电流的各位字符型
strom[1]=0+48;
strom[2]=0+48;
strom[4]=0+48;
strom[5]=0+48;
}
}
/*************************************************************/
/* 温度数值转换 */
/*************************************************************/
void trans_temp() {
if(wendu<2001) //温度为0上的温度
{
wendu&=0x07ff;
zhengshu=wendu/16; //计算温度的整数部分
xiaoshu=(wendu*25/4)%100; //计算温度的小数部分
temperature[0]=zhengshu/100+48; //计算温度的各位的字符值
temperature[1]=(zhengshu%100)/10+48;
temperature[2]=zhengshu%10+48;
temperature[4]=xiaoshu/10+48;
temperature[5]=xiaoshu%10+48;
}
else
{
wendu=~(wendu-1);
zhengshu=wendu/16; //计算温度的整数部分
xiaoshu=(wendu*25/4)%100; //计算温度的小数部分
temperature[0]='-';
temperature[1]=zhengshu/10+48; //计算温度的各位的字符值
temperature[2]=zhengshu%10+48;
temperature[4]=xiaoshu/10+48;
temperature[5]=xiaoshu%10+48;
}
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
pit_count=1;
pit_flag=0;
DisableInterrupts;
init_PIT();
INIT_PLL();
initialize_ect();
LEDCPU_dir=1;
LEDCPU=0;
INIT_AD();
EnableInterrupts;
INIT_LCD();
for(;;)
{
wendu=read_T_001(); //读取温度值
trans_temp();
INIT_LCD();
play_temp();
delay1ms(100);
AD_in3=AD_capture(3);
trans_volt(AD_in3);
play_volt();
trans_strom(AD_in3);
play_strom();
}
}
|
|