OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3258|回复: 11

AD转换问题求助,求大神帮看下

[复制链接]

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
发表于 2020-6-28 15:58:32 | 显示全部楼层 |阅读模式
1金钱
定时器触发AD转换做好了,现在有一个问题困扰我,1.用定时器触发AD转换比如1S触发一次然后用DMA运输保存读取数据,读取的AD值是很准,但是我想要当AD值大于1024时执行LED1=1,小于1024,LED2=1。我用串口打印的话小灯的显示一直为0,用软件触发启动AD转换就能正常,不知道什么原因,还请大神出来帮解决下啊,谢谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-6-28 16:59:02 | 显示全部楼层
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-28 20:54:11 来自手机 | 显示全部楼层
只是想在串口上打印我设置的值,但是打出来全是0,不跟随Ad变化,软件触发和定时器触发有什么区别啊,谢谢
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-28 21:14:25 来自手机 | 显示全部楼层
我理解的软件转换是执行一次21us,采10次求平均就是210us,采集非常快。定时器1ms采集一次的话就会中断一次所以不能灵敏的响应不知对不对
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-29 09:29:36 | 显示全部楼层
无图无真相怎么给你分析
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-29 10:10:42 | 显示全部楼层
volatile uint16_t ADC_ConvertedValue;                        //ADC2éÑùμÄêy¾Y
volatile uint16_t fValue;
volatile uint16_t wValue;
#define ADC1_DR_Address    ((u32)0x4001244C)                //ADC1μÄμØÖ·
u16 LED1,LED2;
//TIM2,arr,psc
void TIM2_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                 //ê±Öóê1Äü

        //TIM23õê¼»ˉ
        TIM_TimeBaseStructure.TIM_Period = arr;                 //éèÖÃÔúÏÂò»¸ö¸üDÂê¼tÖD×°ÔØ
        TIM_TimeBaseStructure.TIM_Prescaler =psc;                         //éèÖÃ×öÆμÂê3yêy
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                 //éèÖÃê±Öó·ÖÆμ:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //TIMÏòéϼÆêy
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMx
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö¿íμ÷ÖÆ
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_Pulse = 1000;//éèÖÃCCRμÄÖμ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔμí
        TIM_OC2Init(TIM2, & TIM_OCInitStructure);                //3õê¼»ˉíaéèTIM2_CH2
       
        TIM_Cmd(TIM2, ENABLE);                         //ê1ÄüTIMx
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

//DMA1
void DMA1_Init()
{
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);                                  //ê1ÄüADC1í¨μàê±Öó
       
        //DMA1???
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                                //ADC1μØÖ·
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;                 //Äú′æμØÖ·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                 //·½Ïò(′óíaéèμ½Äú′æ)
        DMA_InitStructure.DMA_BufferSize = 1;                                                 //′«ËíÄúèYμÄ′óD¡
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                 //íaéèμØÖ·1춨
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;                         //Äú′æμØÖ·1춨
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //íaéèêy¾Yμ¥λ
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;    //Äú′æêy¾Yμ¥λ
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ;                 //DMAģ꽣oÑ-»·′«êä
        DMA_InitStructure.DMA_Priority = DMA_Priority_High ;                 //óÅÏè¼¶¸ß
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                   //½ûÖ1Äú′æÔúÄú′æμÄ′«êä
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //ÅäÖÃDMA1
       
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);                //ê1Äü′«êäíê3éÖD¶Ï

        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        DMA_Cmd(DMA1_Channel1,ENABLE);
}

//GPIO??,PA6
void IO_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);          //??GPIOA??

        //PA6 ??????????   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  
}

void Adc_Init()
{
        ADC_InitTypeDef ADC_InitStructure;
        IO_Init() ;
        TIM2_Init(10000,7199);                //72000000/7200=10000Hz,ÿ3s2é¼ˉò»′Î
        DMA1_Init();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);          //ê1ÄüADC1í¨μà

        //ADC1???
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                         //¶àá¢ADCÄ£ê½
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;                          //1رÕé¨Ãè·½ê½
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                        //1رÕá¬Dø×a»»Ä£ê½
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;           //ê1óÃía2¿′¥·¢Ä£ê½
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                         //êy¾Yóò¶ÔÆë
        ADC_InitStructure.ADC_NbrOfChannel = 1;                         //òa×a»»μÄí¨μàêy
        ADC_Init(ADC1, &ADC_InitStructure);
       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                //ÅäÖÃADCê±Öó,ÎaPCLK2μÄ6·ÖÆμ,Îa12Hz
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_239Cycles5);                //ÅäÖÃADC1í¨μàÎa6ÖüÆúÎa239.5
       
        //??ADC?DMA
        ADC_DMACmd(ADC1,ENABLE);
        ADC_Cmd(ADC1,ENABLE);

        ADC_ResetCalibration(ADC1);                                //¸′λD£Ñé¼Ä′æÆ÷
        while(ADC_GetResetCalibrationStatus(ADC1));                                //μè′yD£Ñé¼Ä′æÆ÷¸′λíê3é

        ADC_StartCalibration(ADC1);                                //ADCD£×¼
        while(ADC_GetCalibrationStatus(ADC1));                                //μè′yD£×¼íê3é
       
        ADC_ExternalTrigConvCmd(ADC1, ENABLE);                //éèÖÃía2¿′¥·¢Ä£ê½ê1Äü
}

//??????
void  DMA1_Channel1_IRQHandler(void)
{
        if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET)
                {
            printf("The current value =%d \r\n",ADC_ConvertedValue);
      DMA_ClearITPendingBit(DMA1_IT_TC1);
          }
}
int main(void)
{
        USART1_Config();
        //NVIC_Configuration();
        Adc_Init();
        while(1)
        {
                if(ADC_ConvertedValue<=1024)
                {
                        LED1=1;LED2=0;
                }       
                else if(ADC_ConvertedValue<=2048)
                {
                        LED1=0;LED2=1;
                }               
                printf(" LED1 =%d\r\n",fValue);
                printf("LED2 =%d \r\n",wValue);
               
        }
}
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-29 10:12:17 | 显示全部楼层
这是整个程序还请高手帮忙看下,哪里写的不对,不管ADC_ConvertedValue如何外界调整,打印输出LED1,LED2都为0
回复

使用道具 举报

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-4-27
在线时间
25 小时
发表于 2020-6-29 11:02:55 | 显示全部楼层
用DMA循环扫描到数组,定时去取数组来做平均值就可以了
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-29 15:57:57 | 显示全部楼层
方便帮我把上面的程序修改下吗?还有我想要采集AD的值出来,使电机走的快或者慢,如果AD的值受到干扰我应该怎么写程序去AD的干扰啊
回复

使用道具 举报

11

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-23
在线时间
26 小时
 楼主| 发表于 2020-6-29 16:05:53 | 显示全部楼层
uint average_AD(uchar times)//这个函数怎么理解啊
{
        uchar count,i;
        unsigned long int sum_AD,reg1;       
        ADMUX = 0;
        AD[ptr] = mega16_AD();
        ptr++;
        ptr = ptr % times;
        if(AD_average < times )
        {
                AD_average++;
                count = AD_average;
        }
        else
                count = times;
        sum_AD = 0;
        for(i = 0;i < count;i++)
        {
                sum_AD += AD[i];
        }
        reg1 = sum_AD / count;
        return(reg1);
       
}

uint average_MotorCurrent(uchar times)//这个不不知道怎么理解
{
        uint MotorCurrentVal;
        unsigned long int reg1;
       
        ADMUX = 2;
       
        MotorCurrentVal = mega16_AD();
        //if(MotorCurrentVal > DUZHUANDIANLIU) return MotorCurrentVal;
        if(MotorCurrentVal > MotorCurrentPrev)
        {
                reg1 = MotorCurrentVal - MotorCurrentPrev;
                reg1 = reg1 / times;
                reg1 = MotorCurrentPrev + reg1;
                reg1 = reg1 % 1024;
        }
        else
        {
                reg1 = MotorCurrentPrev - MotorCurrentVal;
                reg1 = reg1 / times;               
                reg1 = MotorCurrentPrev - reg1;
                reg1 = reg1 % 1024;
        }
        if(D[30]>5)
        {
                //reg1 = reg1 * 1000;
                if(reg1 > 512)
                        reg1 -= 512;
                else
                        reg1 = 0;
                reg1=reg1 *30/D[30];
                reg1 += 512;
        }
        MotorCurrentPrev = reg1;
        return reg1;
}
这是别人写的程序能帮我解释下吗
回复

使用道具 举报

11

主题

2153

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4938
金钱
4938
注册时间
2015-1-10
在线时间
619 小时
发表于 2020-6-30 14:06:36 | 显示全部楼层
printf(" LED1 =%d\r\n",fValue);
printf("LED2 =%d \r\n",wValue);
你这后面fValue和wValue是哪来的,我就看到一个定义
回复

使用道具 举报

11

主题

2153

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4938
金钱
4938
注册时间
2015-1-10
在线时间
619 小时
发表于 2020-6-30 14:08:42 | 显示全部楼层
后面发的两个函数不完整,里面调用的其他函数原型在哪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表