9 changed files with 881 additions and 754 deletions
-
82APP/current_through_mos_capturer.c
-
97APP/main.c
-
44APP/pwm.c
-
2APP/pwm.h
-
3README.md
-
1177project_ozone/Listings/project_o.map
-
180project_ozone/project_o.uvgui.zel
-
45project_ozone/project_o.uvopt
-
5project_ozone/project_o.uvproj
@ -0,0 +1,82 @@ |
|||
#include "port.h" |
|||
#include "systick.h" |
|||
|
|||
static ADC_InitStruType x; |
|||
static GPIO_InitSettingType y; |
|||
static bool adccapture_error = false; |
|||
|
|||
static uint16_t prv_adc_get_value() { |
|||
ErrorStatus status = ADC_SoftStart(); |
|||
adccapture_error = false; |
|||
if (status != SUCCESS) { |
|||
adccapture_error = true; |
|||
return 0; |
|||
} |
|||
uint32_t inticket = get_sys_ticket(); |
|||
|
|||
while (ADC_GetConvStatus() != RESET) { |
|||
if (port_haspassedms(inticket) > 10) { |
|||
adccapture_error = true; |
|||
return 0; |
|||
} |
|||
} |
|||
uint16_t adcv = ADC_GetConvValue(); |
|||
ADC_SoftStop(); |
|||
return adcv ; |
|||
} |
|||
|
|||
static void prv_adc_pb9_init() { |
|||
y.Signal = GPIO_Pin_Signal_Analog; //模拟 |
|||
y.Dir = GPIO_Direction_Input; //输入 |
|||
y.Func = GPIO_Reuse_Func0; |
|||
// x.CHS设置adc采集的通道每个引脚对应一个通道 |
|||
GPIO_Init(GPIO_Pin_B9, &y); |
|||
|
|||
//经过分频以后Tadclk=1/(PCLK/32) |
|||
x.CLKS = ADC_CLKS_PCLK; |
|||
x.CLKDIV = ADC_CLKDIV_1_32; /* ADC时钟源预分频 */ |
|||
|
|||
//采集到的模拟量*3.3/4096=现在的电压 |
|||
x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,仅设置内部参考电压为多少 */ |
|||
x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,这个是设置adc具体是要哪个电压来做参考adc的参考电压为多少 */ |
|||
x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */ |
|||
x.CHS = ADC_CHS_AIN4; |
|||
// x.CHS = ADC_CHS_AIN8; |
|||
x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */ |
|||
//采样时间st*2+1(个Tadclk)=1.743us |
|||
x.ST = 0; /* AD硬件采样时间选择 */ |
|||
x.BITSEL = ADC_BITSEL_8; /* AD分辨率12位 */ |
|||
ADC_Init(&x); |
|||
prv_adc_get_value(); |
|||
} |
|||
|
|||
extern uint32_t getCNT(); |
|||
extern uint32_t getTOP(); |
|||
|
|||
uint16_t capture(int timeoff) { |
|||
static bool inited = false; |
|||
if (inited == false) { |
|||
prv_adc_pb9_init(); |
|||
inited = true; |
|||
} |
|||
|
|||
uint16_t expectCNTBegin = getTOP() / 100.0 * timeoff; |
|||
uint16_t expectCNTEnd = getTOP() / 100.0 * (timeoff + 1); |
|||
// printf("%d %d , %d\n", timeoff, expectCNTBegin, expectCNTEnd); |
|||
|
|||
int icount = 0; |
|||
while (true) { |
|||
volatile uint16_t countnow = T16Nx_GetCNT1(T16N0); |
|||
// printf("%d\n",countnow); |
|||
for (size_t i = 0; i < icount % 10; i++) { |
|||
} |
|||
icount++; |
|||
|
|||
if (countnow >= expectCNTBegin && countnow < expectCNTEnd) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
uint16_t v = prv_adc_get_value(); |
|||
return v; |
|||
} |
1177
project_ozone/Listings/project_o.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
180
project_ozone/project_o.uvgui.zel
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue