- 打卡等级:初来乍到
- 打卡总天数:4
- 最近打卡:2025-08-29 08:03:13
已绑定手机
注册会员
- 积分
- 56
|
一个简单的AD采集,用ACS712ELCTR-05B-T(XBLW)检测电路电流情况,但结果很打脸,ADC数据波动很大,电路中AD端忘了串电阻,后面加上了,效果也不行。最近用STC单片机做了两个小项目,原本觉得很简单,实际很难受了,串口调试工具也是,有时候会连不上,需要断电重启才有用。
串口调试信息如下:
[15:50:26.718]接收←串口初始化成功
ADC_12V_Value: 771
[15:50:27.759]接收←ADC_12V_Value: 769
[15:50:28.769]接收←ADC_12V_Value: 515
[15:50:29.802]接收←ADC_12V_Value: 768
[15:50:30.824]接收←ADC_12V_Value: 2
[15:50:31.836]接收←ADC_12V_Value: 771
[15:50:32.861]接收←ADC_12V_Value: 769
[15:50:33.873]接收←ADC_12V_Value: 1
[15:50:34.899]接收←ADC_12V_Value: 1
[15:50:35.923]接收←ADC_12V_Value: 770
[15:50:36.931]接收←ADC_12V_Value: 771
[15:50:37.952]接收←ADC_12V_Value: 770
[15:50:38.982]接收←ADC_12V_Value: 771
[15:50:40.005]接收←ADC_12V_Value: 515
[15:50:41.014]接收←ADC_12V_Value: 771
[15:50:42.042]接收←ADC_12V_Value: 771
[15:50:43.065]接收←ADC_12V_Value: 771
[15:50:44.077]接收←ADC_12V_Value: 771
[15:50:45.106]接收←ADC_12V_Value: 771
[15:50:46.130]接收←ADC_12V_Value: 771
[15:50:47.137]接收←ADC_12V_Value: 771
[15:50:48.161]接收←ADC_12V_Value: 771
[15:50:49.186]接收←ADC_12V_Value: 771
[15:50:50.208]接收←ADC_12V_Value: 771
[15:50:51.220]接收←ADC_12V_Value: 2
[15:50:52.245]接收←ADC_12V_Value: 770
[15:50:53.269]接收←ADC_12V_Value: 2
[15:50:54.279]接收←ADC_12V_Value: 768
[15:50:55.305]接收←ADC_12V_Value: 1
[15:50:56.331]接收←ADC_12V_Value: 771
[15:50:57.341]接收←ADC_12V_Value: 770
[15:50:58.358]接收←ADC_12V_Value: 1
[15:50:59.385]接收←ADC_12V_Value: 771
[15:51:00.407]接收←ADC_12V_Value: 1
[15:51:01.415]接收←ADC_12V_Value: 771
[15:51:02.442]接收←ADC_12V_Value: 515
[15:51:03.467]接收←ADC_12V_Value: 771
[15:51:04.490]接收←ADC_12V_Value: 769
[15:51:05.502]接收←ADC_12V_Value: 1
[15:51:06.527]接收←ADC_12V_Value: 771
[15:51:07.553]接收←ADC_12V_Value: 1
[15:51:08.563]接收←ADC_12V_Value: 770
[15:51:09.589]接收←ADC_12V_Value: 2
[15:51:10.596]接收←ADC_12V_Value: 2
[15:51:11.621]接收←ADC_12V_Value: 1
[15:51:12.645]接收←ADC_12V_Value: 1
[15:51:13.655]接收←ADC_12V_Value: 2
[15:51:14.680]接收←ADC_12V_Value: 515
[15:51:15.694]接收←ADC_12V_Value: 2
[15:51:16.713]接收←ADC_12V_Value: 771
[15:51:17.740]接收←ADC_12V_Value: 3
[15:51:18.760]接收←ADC_12V_Value: 771
[15:51:19.774]接收←ADC_12V_Value: 771
[15:51:20.795]接收←ADC_12V_Value: 771
[15:51:21.823]接收←ADC_12V_Value: 771
[15:51:22.831]接收←ADC_12V_Value: 3
[15:51:28.952]接收←ADC_12V_Value: 771
[15:51:29.981]接收←ADC_12V_Value: 770
[15:51:30.995]接收←ADC_12V_Value: 771
下面是代码,简单的AD数据采集程序:
#include <stc15.h>
#include <stdio.h>
#include <intrins.h>
// 引脚定义
sbit ADC_12V = P1 ^ 0;
sbit ADC_12V_NEG = P1 ^ 1;
sbit JDQ_12V = P3 ^ 6;
sbit JDQ_12V_NEG = P3 ^ 7;
sbit FMQ = P1 ^ 4;
sbit LED_12V = P1 ^ 3;
sbit LED_12V_NEG = P1 ^ 2;
//定义一些AD采集常量
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
/************************** */
// printf重定向到串口
char putchar(char c)
{
SBUF = c;
while (!TI)
;
TI = 0;
return c;
}
void UART1_Init(void)
{
SCON = 0x50; // 8位数据,可变波特率
AUXR |= 0x01; // 串口1选择定时器2为波特率发生器
AUXR |= 0x04; // 定时器时钟1T模式
T2L = 0xE0; // 设置定时初始值
T2H = 0xFE; // 设置定时初始值
AUXR |= 0x10; // 定时器2开始计时
}
/************************** */
void Delay(unsigned int n)
{
unsigned int x;
while (n--)
{
x = 5000;
while (x--);
}
}
void Delay1000us(void) //@11.0592MHz
{
unsigned char data i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/************************** */
unsigned int GetADCResult(unsigned char ch)
{
unsigned int adc_value;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
adc_value = ( (ADC_RES & 0x03) << 8 ) | ADC_RESL;// 组合10位结果
return adc_value; //返回ADC结果
}
/**************************** */
// IO初始化
void IO_Init(void)
{
// 设置P1.0 P1.1为模拟输入
P1ASF = 0X03; // P1.0和P1.1设置为模拟功能
// 设置P36P37为推挽输出,P3口其他不改变
P3M0 = 0xC0; // P3.6、P3.7设置为推挽输出
P3M1 = 0x00; // P3.6、P3.7设置为推挽输出
// 设置P1.2、P1.3、P1.4为推挽输出(故障灯和蜂鸣器)
P1M0 = 0x1C; // P1.2、P1.3、P1.4设置为推挽输出
P1M1 = 0x00; // P1.2、P1.3、P1.4设置为推挽输出
JDQ_12V = 1;
JDQ_12V_NEG = 1;
FMQ = 1;
LED_12V = 1;
LED_12V_NEG = 1;
//初始化AD
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}
// 主函数示例(初始化+发送测试)
void main(void)
{
IO_Init();
UART1_Init(); // 初始化串口1
printf("串口初始化成功\r\n");
while (1)
{
//打印P1.0 P1.1的AD值
printf("ADC_12V_Value: %u\r\n", GetADCResult(0));
// printf("ADC_12V_NEG_Value: %u\r\n", GetADCResult(1));
Delay1000ms();
}
}
|
-
|