#include "qs_config.h"
#include "qs_analog.h"
#define ADCx ADC1
#define ADCx_CSR_EOC ADC1_CSR_EOC
#define ADCx_CR3_OVR ADC1_CR3_OVR
#define QS_ADC_VIN_CHAN_START 0
#define QS_ADC_VIN_CHAN_PROCESS 1
#define QS_ADC_CURR_CHAN_START 2
#define QS_ADC_CURR_CHAN_PROCESS 3
#define QS_SET_ADC_VALUE 4
uint16_t currentTemp[2][10];
unsigned int current[2];
void ADC_Data_Loopwhile(void)
{
uint8_t i;
uint8_t temph,templ;
static uint8_t mode = QS_ADC_VIN_CHAN_START;
switch(mode) {
case QS_ADC_VIN_CHAN_START:
ADC_Start(ADC_POWER_CHANNEL);
ADCx->CR1 |= 0x01; //开始启动转换
mode = QS_ADC_VIN_CHAN_PROCESS;
break;
case QS_ADC_VIN_CHAN_PROCESS:
if(ADCx->CSR & ADCx_CSR_EOC) {
ADC_Stop();//关闭AD
for(i = 0;i < 10;i++)
{
/* Read LSB first */
templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(i << 1) + 1);
/* Then read MSB */
temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(i << 1));
currentTemp[0][i] = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8));
}
//current[0] = (unsigned int)ADC1->DRL | ((unsigned int)ADC1->DRH << 8);
ADCx->CSR &= (uint8_t)(~ADCx_CSR_EOC);
ADCx->CR3 &= (uint8_t)(~ADCx_CR3_OVR);
mode = QS_ADC_CURR_CHAN_START;
}
break;
case QS_ADC_CURR_CHAN_START:
ADC_Start(ADC_MOTOR_CURRENT_CHANNEL);
ADCx->CR1 |= 0x01; //开始启动转换
mode = QS_ADC_CURR_CHAN_PROCESS;
break;
case QS_ADC_CURR_CHAN_PROCESS:
if(ADCx->CSR & ADCx_CSR_EOC) {
ADC_Stop();//关闭AD
for(i = 0;i < 10;i++)
{
/* Read LSB first */
templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(i << 1) + 1);
/* Then read MSB */
temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(i << 1));
currentTemp[1][i] = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8));
}
//current[1] = (unsigned int)ADC1->DRL | ((unsigned int)ADC1->DRH << 8);
ADCx->CSR &= (uint8_t)(~ADCx_CSR_EOC);
ADCx->CR3 &= (uint8_t)(~ADCx_CR3_OVR);
mode = QS_SET_ADC_VALUE;
}
break;
case QS_SET_ADC_VALUE:
ADC_SetCurrent();
mode = QS_ADC_VIN_CHAN_START;
break;
}
}
unsigned int qs_analog_get_value(uint8_t chann)
{
return current[chann];
}
void ADC_SetCurrent(void)
{
uint8_t i, Index;
for(Index = 0;Index < 2;Index ++)
{
current[Index] = 0;
for(i = 2;i < 10;i++)
current[Index] += currentTemp[Index][i];
current[Index] = current[Index] >> 3;
}
}
/*********************************************
函数功能:ADC单通道转换初始化
输入参数:Channel:Channel_0——Channel_15
输出参数:AD数值
*********************************************/
void ADC_Stop(void)
{
ADCx->CR1 &= ~BIT(0);//关闭AD
}
void ADC_Start(uint8_t channel)
{
ADCx->CR2 = 0x08; // A/D结果数据右对齐
ADCx->CR1 = 0x00;// ADC时钟=主时钟/2=8MHz,单次转换模式
//ADCx->TDRL = 0x01; // 禁止施密特触发功能
//ADCx->TDRH = 0x01;
ADCx->CR3 |= 0x80; //使能缓存
ADCx->CSR= channel; //选择通道
ADCx->CR1 |= 0x02; //2分频,连续转换,启动ADC
ADCx->CR1 |= 0x01;
}
uint16_t adc_convert_data_get(uint8_t channel)
{
uint8_t temph,templ;
uint16_t adc_data;
ADCx->CR2 = 0x08; // A/D结果数据右对齐
ADCx->CR1 = 0x00;// ADC时钟=主时钟/2=8MHz,单次转换模式
//ADCx->TDRL = 0x01; // 禁止施密特触发功能
// ADCx->TDRH = 0x01;
ADCx->CSR= channel; //选择通道
ADCx->CR1 |= 0x02; //2分频,连续转换,启动ADC
ADCx->CR1 |= 0x01;
ADCx->CR1 |= 0x01; //开始启动转换
while(!(ADCx->CSR & ADCx_CSR_EOC));
ADC_Stop();//关闭AD
templ = ADC1->DRL;
temph = ADC1->DRH;
adc_data = (unsigned int)templ | ((unsigned int)temph << 8);
ADCx->CSR &= (uint8_t)(~ADCx_CSR_EOC);
return adc_data;
}
void qs_analog_data_process(void)
{
static uint8_t count = 0;
static uint32_t temp = 0;
static uint8_t idx = 0;
const uint8_t chan[2] = {Channel_7, Channel_6};
temp += adc_convert_data_get(chan[idx]);
count ++;
if(count == 8) {
current[idx] = temp/8;
count = 0;
temp = 0;
idx ^= 0x01;
}
}