Browse Source

feature:1.电池电量读取功能:msp完成;电压采集完成,待补充任务

issu01
Zhangwen 4 months ago
parent
commit
6306b7d38f
  1. 7
      .vscode/settings.json
  2. 2
      source/app/app_config.c
  3. 34
      source/app/main.c
  4. 1
      source/app/main.h
  5. 2
      source/app/task_keystatus.c
  6. 9
      source/bsp/bsp_WT2605B.c
  7. 13
      source/bsp/bsp_WT2605B.h
  8. 3
      source/bsp/bsp_oid.c
  9. 6
      source/bsp/bsp_ooid.c
  10. 6
      source/clib/bit.h
  11. 223
      source/msp/msp_adc.c
  12. 63
      source/msp/msp_adc.h

7
.vscode/settings.json

@ -75,6 +75,11 @@
"vector": "c",
"string_view": "c",
"initializer_list": "c",
"app_eeprom.h": "c"
"app_eeprom.h": "c",
"c51_macro.H": "cpp",
"msp_adc.h": "c",
"system_error": "c",
"*.tcc": "c",
"ctype.h": "c"
}
}

2
source/app/app_config.c

@ -37,7 +37,7 @@ void L3_param_init(void)
Lc_strcpy(G.ap_pwd,"ccsens123");
#if 0
wr_buf.wIndex = wr_buf.rIndex = 0;
wr_buf.wIndex = wr_buf.rIndex = 0;
wr_buf.maxsize = sizeof(wr_buf.buf)/sizeof(PenPoint);
for(i=0;i<wr_buf.maxsize;i++)
{

34
source/app/main.c

@ -21,6 +21,8 @@ void L0_MCU_init(void)
L3_param_init();
//R初始化
L3_reg_init();
// ADC初始化
L0_ADC_init();
}
void L0_BSP_init(void)
@ -37,7 +39,7 @@ void L0_BSP_init(void)
L2_OID_init();
LED2 = 0;
L0_Oid_Init();
// L0_Oid_Init();
}
void L0_TASK_init(void)
{
@ -91,32 +93,30 @@ void main(void)
while(1)
{
// L1_Oid_readoid();
if(1 == s_nos_tick.t1s_heartbeat)//1s
{
s_nos_tick.t1s_heartbeat = 0;//置0清空
L0_uart0_uc('.');
// L0_uart0_sendstr("_s_w600_mode =");
// L0_uart0_uchex(_s_task_w600_para.mode);
// L0_uart0_0d0a();
// L0_uart0_sendstr("R.app_status =");
// L0_uart0_uchex(R.app_status);
// L0_uart0_uc('.');
// L0_uart0_sendstr("ADC = ");
L0_uart0_us(L1_ADC_Read(12));
}
// // 系统状态任务
// L3_task_appstatus_handler(&_s_task_appstatus);
// // 系统状态测试任务
// // L3_task_AppTest_handler(&_s_task_apptest);
// // 按键状态任务
L3_task_keystatus_handler(&_s_task_keystatus);
// // WIFI任务
// L3_task_keystatus_handler(&_s_task_keystatus);
// // OID和WIFI任务
// if (R.app_status != POW_OFF)
// {
// // OID数据采集
// L1_Oid_readoid();
// // WIFI数据解析
// L3_uart2_wifi_parse();
// L2_task_W600_flow_handle(&_s_task_w600_para);
// }
#if 0
#if 0
if(s_uart0_rec.ok)
{
//// buf 0 1 2 3 4 5 6 7
@ -155,12 +155,16 @@ void main(void)
#endif
}
}
// L0_uart0_sendstr("_s_w600_mode =");
// L0_uart0_uchex(_s_task_w600_para.mode);
// L0_uart0_0d0a();
// L0_uart0_sendstr("R.app_status =");
// L0_uart0_uchex(R.app_status);
// 上电读出寄存器中的值,放到数组中
// L0_Iap_Read_array(EEPROM_DATA_ADDR, data_save_arr,sizeof(data_save_arr));
// if(data_save_arr[0].head[0] != HEAD0 || data_save_arr[0].head[1] != HEAD1
// || data_save_arr[0].tail[0] != TAIL0 || data_save_arr[0].tail[1] != TAIL1)
// {
// data_save_init();
// data_save_init();
// }

1
source/app/main.h

@ -45,6 +45,7 @@
#include "../msp/uart2.h"
#include "../msp/uart3.h"
#include "../msp/uart4.h"
#include "../msp/msp_adc.h"
// #include "../msp/eeprom.h"
// #include "../msp/msp_eeprom.h"

2
source/app/task_keystatus.c

@ -85,6 +85,7 @@ void L3_task_keystatus_handler(S_TASK_KEYSTATUS *s)
if (s->Key1_handled == 0)
{
s->Key1_handled = 1;
L0_uart0_uc('1');
L2_WT2605B_VioceUp(); // 音量增加
}
}
@ -93,6 +94,7 @@ void L3_task_keystatus_handler(S_TASK_KEYSTATUS *s)
if (s->Key2_handled == 0)
{
s->Key2_handled = 1;
L0_uart0_uc('2');
L2_WT2605B_VioceDown(); // 音量减少
}
}

9
source/bsp/bsp_WT2605B.c

@ -12,10 +12,17 @@ TS_SPEECH_AUDIO audio_TCP_connected = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x34,0x92
TS_SPEECH_AUDIO audio_config_mode = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x35,0x93,0xEF}; //配置模式
TS_SPEECH_AUDIO audio_config_complete = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x36,0x94,0xEF}; //配置完成
TS_SPEECH_AUDIO audio_config_phone = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x37,0x95,0xEF}; //手机APP配置
TS_SPEECH_AUDIO audio_volume_up = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x38,0x96,0xEF}; //音量增加
TS_SPEECH_AUDIO audio_volume_down = {0x7E,0x07,0xA3,0x54,0x30,0x30,0x39,0x97,0xEF}; //音量减少
TS_SPEECH_AUDIO audio_game_maze = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x30,0x8F,0xEF}; //迷宫
TS_SPEECH_AUDIO audio_game_different = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x31,0x90,0xEF}; //找不同
TS_SPEECH_AUDIO audio_game_shulte = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x32,0x91,0xEF}; //舒尔特方格
TS_SPEECH_AUDIO audio_game_error = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x33,0x92,0xEF}; //错误
TS_SPEECH_AUDIO audio_game_correct = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x34,0x93,0xEF}; //正确提示音
TS_SPEECH_AUDIO audio_game_overtime = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x35,0x94,0xEF}; //训练时间到
TS_SPEECH_AUDIO audio_game_complete = {0x7E,0x07,0xA3,0x54,0x30,0x31,0x36,0x95,0xEF}; //训练完成
TS_SPEECH_VOLUME volume_control = {0x7E,0x04,0xAE,0x1E,0xD0,0xEF}; //音量控制

13
source/bsp/bsp_WT2605B.h

@ -32,15 +32,16 @@ extern TS_SPEECH_AUDIO audio_TCP_connected;
extern TS_SPEECH_AUDIO audio_config_mode;
extern TS_SPEECH_AUDIO audio_config_complete;
extern TS_SPEECH_AUDIO audio_config_phone;
extern TS_SPEECH_AUDIO audio_volume_up;
extern TS_SPEECH_AUDIO audio_volume_down;
extern TS_SPEECH_AUDIO audio_select;
extern TS_SPEECH_AUDIO audio_tip;
extern TS_SPEECH_AUDIO audio_zmg_again;
extern TS_SPEECH_AUDIO audio_zmg_success;
extern TS_SPEECH_AUDIO audio_game_maze; //迷宫
extern TS_SPEECH_AUDIO audio_game_different; //找不同
extern TS_SPEECH_AUDIO audio_game_shulte; //舒尔特方格
extern TS_SPEECH_AUDIO audio_game_error; //错误
extern TS_SPEECH_AUDIO audio_game_correct; //正确
extern TS_SPEECH_AUDIO audio_game_overtime; //训练时间到
extern TS_SPEECH_AUDIO audio_game_complete; //训练完成
extern TS_SPEECH_VOLUME volume_control;

3
source/bsp/bsp_oid.c

@ -6,6 +6,7 @@
#include "../ctask/task.h"
#include "../ctask/tick.h"
#include "../app/app_task_speech.h"
#include "../bsp/bsp_WT2605B.h"
@ -669,7 +670,7 @@ void L1_Oid_readoid(void)
{
if(!OID_DET)
{
// LED1 = ~LED1;
L2_WT2605B_Broadcast(&audio_game_correct);
ts_oid.pre_x = ts_oid.X100;
ts_oid.pre_y = ts_oid.Y100;
L0_oid_Recv64(); //ts_oid.rec.d[i/8] <<= 1;

6
source/bsp/bsp_ooid.c

@ -1,11 +1,11 @@
#include "../bsp/bsp_ooid.h"
#include "../bsp/bsp_wifi.h"
void L2_OID_init()
{
D_stdIO_P3(BITN4);
D_HighI_P5(BITN0);
D_HighI_P3(BITN4);
P34 = 0;
D_HighR_P5(BITN0);
L2_OID_WIFI_Open();
}

6
source/clib/bit.h

@ -351,12 +351,16 @@
#define BITN_1(X,BITNx) (X)|= (BITNx)
#define BITN_0(X,BITNx) (X)&=~(BITNx)
#define BITN_G(X,BITNx) ((X)&(BITNx))
#define BITN_M(X,mask) (X)&=(mask)
#define BITN_S(X,BITNx,mask) BITN_M(X,mask);BITN_1(X,BITNx)///设置类似通道之类的多位操作
//BITN_1(reg,BITN0)
#define BITS_1(X,BITx) (X)|= (BITx)
#define BITS_0(X,BITx) (X)&=~(BITx)
#define BITC_1 0X01
#define BITC_2 0X03
#define BITC_3 0X07

223
source/msp/msp_adc.c

@ -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_CONTRPWM 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_POWERADC
0
ADC 1 ADC
ADC
1 MCU ADC 1ms, MCU ADC ADC
2 ADC ,
ADC_STARTADC 1 ADC
0使 ADC 0 A/D
1 ADC
ADC_FLAGADC 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

63
source/msp/msp_adc.h

@ -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…
Cancel
Save