打印
[STM32F1]

ADC转换完成标志位的问题

[复制链接]
2314|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiashengcheng|  楼主 | 2016-1-26 18:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC转换启动后就一直停在这个转换完成标志位查了两天了没查出问题所在,请大神指点一二
#include "stm32f10x.h"
#define run0                 GPIO_ResetBits(GPIOA,GPIO_Pin_15);//动行指示   打开
#define spwm0         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//脉冲调节
#define pwmon0         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//脉冲输出打开
#define km0                 GPIO_ResetBits(GPIOB,GPIO_Pin_7);//主接触器吸合

#define run1                 GPIO_SetBits(GPIOA,GPIO_Pin_15);
#define spwm1         GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define pwmon1         GPIO_SetBits(GPIOB,GPIO_Pin_5);
#define km1                 GPIO_SetBits(GPIOB,GPIO_Pin_7);
unsigned char data_GLBIT;//过流标志
unsigned char data_GYBIT;//过压标志
unsigned char data_CWBIT;//超温标志
unsigned char data_TZBIT;//停止标志
unsigned int data_tim_km;//主接触器上处时上电时间定时
unsigned int data_Tickcnt1;                        //TICK10次计数
unsigned int        data_Tickcnt10;                //TICK10次计数加一
unsigned int         data_DLset;                //电流设定值
unsigned int         data_DYset;        //电压设定值
unsigned int         data_DLadc;//电流采样值
unsigned int         data_DYadc;//电压采样值


void GPIO_Configuration(void)        //IO初始化
{
        GPIO_InitTypeDef GPIO_InitPAIN;
        GPIO_InitTypeDef GPIO_InitPBIN;
        GPIO_InitTypeDef GPIO_InitPAOUT;
        GPIO_InitTypeDef GPIO_InitPBOUT;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOA|GPIOB时钟
//RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
                GPIO_InitPAIN.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;                                                                                                                                                                                                                                                //选(pin1 pll-3)/(Pin2 pll-1)/(Pin3 GL)/锁相环频率锁相过流输入
                GPIO_InitPAIN.GPIO_Mode=GPIO_Mode_IPU;                                                                                        //上拉输入模式
                GPIO_InitPAIN.GPIO_Speed=GPIO_Speed_50MHz;                                                                        //输出频率50MHz
                GPIO_Init(GPIOA,&GPIO_InitPAIN);                                                                                                //PA接口初始化
                GPIO_InitPBIN.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6;                                                                                                                                                                                                                                                //选中(Pin3 QD)/(PB4 TZ)/(Pin6 CW)启动停止超温输入
                GPIO_InitPBIN.GPIO_Mode=GPIO_Mode_IPU;                                                                //上拉输入模式
                GPIO_InitPBIN.GPIO_Speed=GPIO_Speed_50MHz;                                                //输入模式可以不写
                GPIO_Init(GPIOB,&GPIO_InitPBIN);                                                                        //PB接品初始化
                GPIO_InitPAOUT.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_15;                                                                                                                                                                                                                                                                                        //(pin-4pwm-set)/(PIN-15run)脉冲调频,动行指示输出
                GPIO_InitPAOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                        //开漏输 出模式
                GPIO_InitPAOUT.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&GPIO_InitPAOUT);       
                GPIO_InitPBOUT.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;                                                                                                                                                                                                                                                                                        //(PIN_5pwm-on0/(PIN_7out-km)脉冲输出打开 主接触器吸合
                GPIO_InitPBOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                //开漏输出模式
                GPIO_InitPBOUT.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOB,&GPIO_InitPBOUT);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
                GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

}
//------------------------------------------------
void input(void)
{
        //判断启动
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==0)
                {//判断接触器吸合后才能工作PB7=KM
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0)
                        {
                        spwm0;
                        pwmon0;
                        }
                }
//判断停止
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
                {
                        if(data_GLBIT==1)
                        {
                        data_GLBIT=0;
                        km0;
                        }
                        else
                        {
                        spwm1;
                        pwmon1;
                        }
                       

                }
//判断超温输入信号
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
                {
                        spwm1;
                        pwmon1;
                        km1;
                        data_CWBIT=1;
                }

}
//+++++++++++++++++++Tick定时器+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void Delay (u16 m)
{
SysTick->LOAD=m*9000;
SysTick->CTRL|=0X03;       
}
//+++++++++++++++++比较ADC转换结果电压和电流值是否超限++++++++++++++++++++++++++++++++++++++++++++
void CMPadc(void)
{
if(data_DLadc>data_DLset)
{

}
if(data_DYadc>data_DYset)
{

}


}
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  //* Set the Vector Table base location at 0x08004000
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置 中断优先级
  //* Enable the EXTI1 Interrupt
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //设置 中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定抢占式优先级别
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //次优先级别为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //中断通道使能
  NVIC_Init(&NVIC_InitStructure);                  //初始化中断
}
void EXIT3_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); //将EXTI线1连接到端口GPIOA的第在3脚
EXTI_InitStructure.EXTI_Line = EXTI_Line3; //如果配置的是1号针脚那么必须是EXTI——LINE3
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);    //初始化中断
}       
void km_config(void)
{//判断是否过流过流后不再吸合接触器
if(data_GLBIT==0)
{
        if(data_Tickcnt10>data_tim_km)
        {
                km0;
                        }
                                }
}

/* USART初始化 */
//void USART1_Init(void)
//{
//        GPIO_InitTypeDef GPIO_InitStructure;
//        USART_InitTypeDef USART_InitStructure;
//       
//        RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA的时钟
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART的时钟
//        /* USART1的端口配置 *///
//        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);//配置PA9成第二功能引脚        TX
//        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);//配置PA10成第二功能引脚  RX       

//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//        GPIO_Init(GPIOA, &GPIO_InitStructure);
//       

//        /* USART1的基本配置 */
//        USART_InitStructure.USART_BaudRate = 115200;              //波特率
//        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//        USART_InitStructure.USART_StopBits = USART_StopBits_1;
//        USART_InitStructure.USART_Parity = USART_Parity_No;
//        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

//        USART_Init(USART1, &USART_InitStructure);               
//        USART_Cmd(USART1, ENABLE);                             //使能USART1
//       
//                               
//}
//void USART_ENABLE_REV(void)
//{        NVIC_InitTypeDef NVIC_InitStruct;
//        NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
//        NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
//        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
//        NVIC_Init(&NVIC_InitStruct);
//        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);         
//}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++主程序+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*******************************************************************************
* 函数名  : ADC1_Init_Config
* 描述    : ADC1初始化配置
* 输入    : 无
* 输出    : 无
* 返回    : 无
* 说明    : 只是初始化了ADC1但未启动ADC1转换
*******************************************************************************/                                                                                                                                  
void ADC1_Init_Config(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE ); //使能ADC1和GPIOA外设时钟
        RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟分频因子为6(72M/6=12M),ADC最大工作频率为14M
        /*设置PA0模拟通道输入引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;                        //选择要初始化的GPIOA的PA5|PA6引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //工作模式为模拟输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置引脚输出最大速率为50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                //调用库函数中的GPIO初始化函数,初始化GPIOB中的PB5,PB6,PB7,PB8引脚

        /*初始化配置ADC1*/
        ADC_DeInit(ADC1); //复位ADC1,即将ADC1的所有寄存器设置为缺省值
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                                        //ADC1工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;                                                //扫描模式设置,多通道下使用使能,单通道下使用失能
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //由软件来触发转换启动,也可以设置成外设启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;                                                                //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);                                                                        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  
// ADC_DMACmd(ADC1,DISABLE);//关闭DMA请求
        ADC_Cmd(ADC1, ENABLE);                                                //使能ADC1,但还没启动ADC1
       
        ADC_ResetCalibration(ADC1);                                        //使能ADC1复位校准寄存器         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位完成       
        ADC_StartCalibration(ADC1);                                        //开启AD校准
        while(ADC_GetCalibrationStatus(ADC1));                //等待校准完成
        //ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
}
u16 ADC1_Get_AdcValue(u8 ch)   
{
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //设置ADC1的转换通道ch,一个序列,采样时间为1.5周期                                       
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                                                //软件启动ADC1开始转换       
         
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )==RESET);                                                //等待AD转换结束
        return ADC_GetConversionValue(ADC1);                                                                //返回最近一次ADC1规则组转换的AD值
}

int main(void)
{
        GPIO_Configuration();//GPIO初始化
        run1;//GPIOA p15
        spwm1;//GPIOA p4
        pwmon1;//GPIOB p5
        km1;//GPIOB p7
        Delay(100);
        NVIC_Configuration();
        EXIT3_Configuration();
//初始化数据
        data_tim_km=0;                       
        data_Tickcnt1=0;
        data_Tickcnt10=0;
        data_GLBIT=data_GYBIT=data_CWBIT=data_TZBIT=0;
        data_DYset=data_DLset=200;
        data_tim_km=data_Tickcnt10+5;
       
while(1)
{
       
        data_DLadc = ADC1_Get_AdcValue(5); //读取并返回ADC对应通道的AD转换值
        data_DYadc = ADC1_Get_AdcValue(6);
        input();//启停超温过流检测
        CMPadc();
        km_config();


}
}
沙发
xiashengcheng|  楼主 | 2016-1-26 18:09 | 只看该作者
停在230行
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )==RESET);

使用特权

评论回复
板凳
quray1985| | 2016-1-26 20:23 | 只看该作者
你这个问题确实没遇到过,和我现在用的程序是一样的

使用特权

评论回复
地板
中白菜| | 2019-8-1 10:24 | 只看该作者
楼主解决了吗  我也遇到了同样的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

107

帖子

1

粉丝