OpenEdv-开源电子网

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

STM32F4 HAL ADC

[复制链接]

8

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2016-12-30
在线时间
37 小时
发表于 2016-12-30 11:26:10 | 显示全部楼层 |阅读模式
1金钱
使用STM32F4点HAL库做ADC功能,开发板例子(ADC实验)里面只有单次采集的,我想做成连续采集,但是一直没成功.求指导.


下面是部分代码:

void MY_ADC_Init(void)
{
  ADC1_Handler.Instance = ADC1;
  ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;
  ADC1_Handler.Init.ScanConvMode = ENABLE;
  ADC1_Handler.Init.ContinuousConvMode = ENABLE;
  ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;
  ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  ADC1_Handler.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
  ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  ADC1_Handler.Init.NbrOfConversion = 1;
  ADC1_Handler.Init.DMAContinuousRequests = DISABLE;
  ADC1_Handler.Init.EOCSelection = ADC_EOC_SEQ_CONV;//ADC_EOC_SINGLE_CONV;
  HAL_ADC_Init(&ADC1_Handler);
}


void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
        ADC_ChannelConfTypeDef ADC1_ChanConf;
    GPIO_InitTypeDef GPIO_Initure;
        if(hadc->Instance==ADC1)
        {
                __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
            __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
               
            GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
            GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
            GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
            HAL_GPIO_Init(GPIOA,&GPIO_Initure);
                       
               
            
            ADC1_ChanConf.Channel=ADC_CHANNEL_5;                                   //通道
            ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
            ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间               
            HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置

                /* Peripheral interrupt init */
            HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
            HAL_NVIC_EnableIRQ(ADC_IRQn);
                       
            HAL_ADC_Start_IT(&ADC1_Handler);                               //开启ADC
               
            //HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
        }
}




void ADC_IRQHandler(void)
{
      HAL_ADC_IRQHandler(&ADC1_Handler);
}


u16 Get_Adc(u32 ch)   
{
        return (u16)HAL_ADC_GetValue(&ADC1_Handler);                //返回最近一次ADC1规则组的转换结果
}

最佳答案

查看完整内容[请看2#楼]

首先这个程序是别人搞得time1触发采样的。要改。从新设置adc独立规则模式,dma设置好。 另外定义一个多维数组 __IO uint16_t ADC1_Reg_Value[10][8]; HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t*)&ADC1_Reg_Value, 80) 如要中断方式自己写dma2strem0的中断。 但是要注意不管什么方法,处理时候要关闭各种adc,dma中断,否则规则通道数值会错位。 我这个数组用于一次采10组8个通道de数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2016-12-30 11:26:11 | 显示全部楼层
首先这个程序是别人搞得time1触发采样的。要改。从新设置adc独立规则模式,dma设置好。
另外定义一个多维数组
__IO uint16_t ADC1_Reg_Value[10][8];
HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t*)&ADC1_Reg_Value, 80)
如要中断方式自己写dma2strem0的中断。
但是要注意不管什么方法,处理时候要关闭各种adc,dma中断,否则规则通道数值会错位。
我这个数组用于一次采10组8个通道de数据。
回复

使用道具 举报

8

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2016-12-30
在线时间
37 小时
 楼主| 发表于 2016-12-30 16:03:37 | 显示全部楼层
回复

使用道具 举报

0

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2015-12-7
在线时间
66 小时
发表于 2016-12-31 12:26:45 | 显示全部楼层
连续采集要用DMA
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-1-1 20:29:28 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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