12 changed files with 340 additions and 29 deletions
@ -1,11 +1,11 @@ |
|||||
#include "../bsp/bsp_ooid.h" |
#include "../bsp/bsp_ooid.h" |
||||
#include "../bsp/bsp_wifi.h" |
#include "../bsp/bsp_wifi.h" |
||||
|
|
||||
|
|
||||
void L2_OID_init() |
void L2_OID_init() |
||||
{ |
{ |
||||
D_stdIO_P3(BITN4); |
D_HighI_P3(BITN4); |
||||
D_HighI_P5(BITN0); |
P34 = 0; |
||||
|
D_HighR_P5(BITN0); |
||||
L2_OID_WIFI_Open(); |
L2_OID_WIFI_Open(); |
||||
} |
} |
||||
|
|
||||
|
@ -0,0 +1,223 @@ |
|||||
|
#include "../msp/msp_adc.h" |
||||
|
#include "../msp/uart0.h" |
||||
|
|
||||
|
|
||||
|
/*********
|
||||
|
1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; |
||||
|
2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够, 内部才能和外部电势相等。 |
||||
|
19.1.1 ADC 控制寄存器(ADC_CONTR),PWM 触发 ADC 控制 |
||||
|
符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 |
||||
|
ADC_CONTR BCH ADC_POWER ADC_START ADC_FLAG ADC_EPWMT ADC_CHS[3:0] |
||||
|
ADC_POWER:ADC |
||||
|
电源控制位 0: |
||||
|
关闭 ADC 电源 1:打开 ADC 电源。 |
||||
|
建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗 |
||||
|
特别注意: 1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; |
||||
|
2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够内部才能和外部电势相等。 |
||||
|
ADC_START:ADC 转换启动控制位。写入 1 后开始 ADC 转换,转换完成后硬件自动将此位清零。 |
||||
|
0:无影响。即使 ADC 已经开始转换工作,写 0 也不会停止A/D 转换。 |
||||
|
1:开始 ADC 转换,转换完成后硬件自动将此位清零。 |
||||
|
ADC_FLAG:ADC 转换结束标志位。当 ADC 完成一次转换后,硬件会自动将此位置 1, |
||||
|
并向 CPU 提出 中断请求。此标志位必须软件清零。 |
||||
|
|
||||
|
层次 >逻辑 >数据流 >测试 >工具 > 代码 |
||||
|
套路(方法论)才是最主要的 |
||||
|
12位 800K |
||||
|
反推 |
||||
|
22M / 64(采样的总时间)= |
||||
|
|
||||
|
*********/ |
||||
|
|
||||
|
|
||||
|
void L0_ADC_init(void) |
||||
|
{ |
||||
|
P0M0 = 0x00; |
||||
|
P0M1 = 0x10; //设置P0.4为ADC口
|
||||
|
|
||||
|
ADC_CONTR = 0; |
||||
|
D_ADC_POWER_ON(); //打开ADC电源
|
||||
|
// D_ADC_average();
|
||||
|
// D_EN_EREG();
|
||||
|
|
||||
|
///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择保持时间控制//22M
|
||||
|
///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于 01010B)
|
||||
|
ADCTIM = B1010_0000|B0000_1111; |
||||
|
|
||||
|
ADCCFG = B0010_0000|4; //SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)}
|
||||
|
|
||||
|
Lc_delay_ms(1); //给MCU的内部ADC模块电源打开后,需等待约1ms,等MCU内部的ADC电源稳定后再让ADC工作
|
||||
|
D_ADC_CH(D_ADC_CH_12); //选择ADC12(P04)
|
||||
|
D_ADC_START(); |
||||
|
|
||||
|
L0_uart0_sendstr("\r\n L0_ADC_init on"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
U16 L1_ADC_Read(u8 CHA) |
||||
|
{ |
||||
|
vU16 adc_data; |
||||
|
vU32 overtimes; |
||||
|
int *BGV; //内部1.19V参考信号源值存放在idata中
|
||||
|
//idata的EFH地址存放高字节
|
||||
|
//idata的F0H地址存放低字节
|
||||
|
BGV = (int idata *)0xef; |
||||
|
//vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压
|
||||
|
//注意,此电压的单位为毫伏(mV)
|
||||
|
D_ADC_CH(CHA); |
||||
|
D_ADC_START(); |
||||
|
// NOP2();
|
||||
|
NOP(); |
||||
|
NOP(); |
||||
|
// BITN_S(ADCEXCFG,)
|
||||
|
// while(1 == D_ADC_OVER())
|
||||
|
// {
|
||||
|
// if(overtimes++ > 600000)////
|
||||
|
// {
|
||||
|
// // printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA);
|
||||
|
// L0_uart0_sendstr("ADC_CONTR = ");
|
||||
|
// L0_uart0_ushex(ADC_CONTR);
|
||||
|
// L0_uart0_0d0a();
|
||||
|
// L0_uart0_sendstr("CHA = ");
|
||||
|
// L0_uart0_ushex(CHA);
|
||||
|
// return 0;/// !3Ac7 W7 291
|
||||
|
// }
|
||||
|
// }
|
||||
|
D_ADC_CLEARFLAG(); |
||||
|
|
||||
|
adc_data = ADC_RES; |
||||
|
adc_data <<= 8; |
||||
|
adc_data |= ADC_RESL; |
||||
|
///adc_data >>= 3;
|
||||
|
///r = adc_data;
|
||||
|
return adc_data; |
||||
|
} |
||||
|
|
||||
|
#if 0 |
||||
|
|
||||
|
U16 L1_ADC_Read(u8 CHA) |
||||
|
{ |
||||
|
vU16 adc_data; |
||||
|
ADC_CONTR &=0xF8; |
||||
|
ADC_CONTR |=0x40;//启动AD转换
|
||||
|
//ADC_CONTR |= CHA;
|
||||
|
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
|
||||
|
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; |
||||
|
NOP(); |
||||
|
NOP(); |
||||
|
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
|
||||
|
ADC_CONTR &= ~0x20; //清标志
|
||||
|
adc_data = ADC_RES; |
||||
|
adc_data <<= 8; |
||||
|
adc_data |= ADC_RESL; |
||||
|
//adc_data = adc_data<<2;
|
||||
|
//adc_data = ADC_RESL & 0X03;
|
||||
|
//adc_data = adc_data | adc_data;
|
||||
|
///L0_uart1_sendstr("ADC:");
|
||||
|
///L0_uart1_ushex(adc_data);
|
||||
|
///L0_uart1_0d0a();
|
||||
|
return (adc_data); //返回A/D转换结果(8位)
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc)
|
||||
|
|
||||
|
|
||||
|
void L3_ADC_debug(u8 filter) |
||||
|
{ |
||||
|
u8 i; |
||||
|
if(filter == Ts_debug.td->filter) |
||||
|
{///filter num d1 d2 d3 ....dn
|
||||
|
//// FD 08 11 22 33 44 55 66 77 88
|
||||
|
L1_uartD_uchexArray(Ts_debug.td,Ts_debug.td->R1); |
||||
|
if(0x10 == Ts_debug.td->ocr)///read 读,判断哪个adc读取
|
||||
|
{//fa 05 f1 33 10
|
||||
|
//NUM: 0 1 2 3 4
|
||||
|
// Fx R1 R2 R3 ocr
|
||||
|
// sla reg1 num
|
||||
|
/// f1 32 15 06 10
|
||||
|
//printf("\r\n ch(%d)=",(int)Ts_debug.td->R2);
|
||||
|
for(i = 0xf1;i <= 0xf8;i++) |
||||
|
{ |
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(i); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc1
|
||||
|
} |
||||
|
/*
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf2); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc2
|
||||
|
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf3); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc3
|
||||
|
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf4); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc4
|
||||
|
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf5 ); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc5
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf6); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc6
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf7); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc7
|
||||
|
Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf8); |
||||
|
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc8
|
||||
|
*/ |
||||
|
} |
||||
|
else if(0x11 == Ts_debug.td->ocr) |
||||
|
{ |
||||
|
//printf("\r\n ch(%d)=",(int)Ts_debug.td->R1);
|
||||
|
//Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1);
|
||||
|
} |
||||
|
else if(0x12 == Ts_debug.td->ocr) |
||||
|
{ |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
//printf"(\r\n ch(%d)=",(int)Ts_debug.td->R1);
|
||||
|
//Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1);
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
U16 L1_ADC_Read_VBAT (unsigned char CHA)//CHA通道号
|
||||
|
{ |
||||
|
U16 adc_data; |
||||
|
#if 0 |
||||
|
U8 AD_FIN=0; //存储A/D转换标志
|
||||
|
//CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
|
||||
|
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置
|
||||
|
Lc_delay_nop(1); |
||||
|
//ADC_CONTR |= CHA; //选择A/D当前通道
|
||||
|
//Lc_delay_nop(1);
|
||||
|
ADC_CONTR |= 0x80; //启动A/D电源
|
||||
|
Lc_delay_ms(1); //使输入电压达到稳定(1ms即可)
|
||||
|
ADC_CFG = 0x20; |
||||
|
Lc_delay_nop(1); |
||||
|
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
|
||||
|
//ADC_CONTR |= CHA; //选择A/D当前通道
|
||||
|
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; |
||||
|
Lc_delay_nop(1); |
||||
|
ADC_CONTR |= 0x40; //启动AD转换
|
||||
|
NOP(); |
||||
|
NOP(); |
||||
|
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
|
||||
|
ADC_CONTR &= ~0x20; //清完成标志
|
||||
|
//P2 = ADC_RES; //读取ADC结果
|
||||
|
#endif |
||||
|
ADC_CONTR &=0xF8; |
||||
|
ADC_CONTR |=0x40;//启动AD转换
|
||||
|
//ADC_CONTR |= CHA;
|
||||
|
ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; |
||||
|
NOP(); |
||||
|
NOP(); |
||||
|
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
|
||||
|
ADC_CONTR &= ~0x20; //清标志
|
||||
|
adc_data = ADC_RES; |
||||
|
adc_data <<= 8; |
||||
|
adc_data |= ADC_RESL; |
||||
|
//adc_data = adc_data<<2;
|
||||
|
//adc_data = ADC_RESL & 0X03;
|
||||
|
//adc_data = adc_data | adc_data;
|
||||
|
//L0_uart0_ushex(adc_data);
|
||||
|
//L0_uart0_0d0a();
|
||||
|
return (adc_data); //返回A/D转换结果(8位)
|
||||
|
} |
||||
|
#endif |
@ -0,0 +1,63 @@ |
|||||
|
#ifndef _msp_adc_H_ |
||||
|
#define _msp_adc_H_ |
||||
|
|
||||
|
#include "../bsp/bsp_config.h" |
||||
|
#include "../msp/UART0.h" |
||||
|
#include "../cpu/STC_stc8h3k.H" |
||||
|
#include "../clib/bit.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
#define ADC_POWER BITN7 |
||||
|
#define ADC_START BITN6 |
||||
|
#define ADC_FLAG BITN5 |
||||
|
#define ADC_EPWMT BITN4 |
||||
|
|
||||
|
#define D_ADC_CHS_mask 0xF0 |
||||
|
|
||||
|
#define ADC_CHS3 BITN3 |
||||
|
#define ADC_CHS2 BITN2 |
||||
|
#define ADC_CHS1 BITN1 |
||||
|
#define ADC_CHS0 BITN0 |
||||
|
|
||||
|
#define ADC_RESFMT BITN5 |
||||
|
|
||||
|
#define ADC_SPEED3 BITN3 |
||||
|
#define ADC_SPEED2 BITN2 |
||||
|
#define ADC_SPEED1 BITN1 |
||||
|
#define ADC_SPEED0 BITN0 |
||||
|
|
||||
|
#define D_CVTIMESEL_mask 0xF8 |
||||
|
|
||||
|
#define D_CVTIMESEL_1 0 |
||||
|
#define D_CVTIMESEL_2 4 |
||||
|
#define D_CVTIMESEL_4 5 |
||||
|
#define D_CVTIMESEL_8 6 |
||||
|
#define D_CVTIMESEL_16 7 |
||||
|
|
||||
|
|
||||
|
#define D_ADC_average() D_EN_EREG(); BITN_S(ADCEXCFG,D_CVTIMESEL_16,D_CVTIMESEL_mask)////4 22M 1ms---
|
||||
|
|
||||
|
|
||||
|
#define D_ADC_POWER_ON() BITN_1(ADC_CONTR, ADC_POWER) |
||||
|
#define D_ADC_POWER_OFF() BITN_0(ADC_CONTR, ADC_POWER) |
||||
|
|
||||
|
#define D_ADC_START() BITN_1(ADC_CONTR, ADC_START) |
||||
|
#define D_ADC_STOP() BITN_0(ADC_CONTR, ADC_START) |
||||
|
|
||||
|
#define D_ADC_OVER() BITN_G(ADC_CONTR, ADC_FLAG) |
||||
|
#define D_ADC_CLEARFLAG() BITN_0(ADC_CONTR, ADC_FLAG) |
||||
|
|
||||
|
#define D_ADC_CH(X) BITN_S(ADC_CONTR,X,D_ADC_CHS_mask) |
||||
|
|
||||
|
#define D_ADC_CH_12 12 |
||||
|
|
||||
|
#define D_cmd_filter_adc 0xfa |
||||
|
|
||||
|
extern void L0_ADC_init (void); |
||||
|
extern U16 L1_ADC_Read(u8 CHA); |
||||
|
|
||||
|
#endif //#ifndef _msp_adc_H_
|
||||
|
|
||||
|
|
||||
|
|
Loading…
Reference in new issue