硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4611|回复: 6
收起左侧

[有问必答] V5开发板用户手册 的ADC定時觸發 疑問

[复制链接]

34

主题

112

回帖

214

积分

高级会员

积分
214
发表于 2015-5-27 14:29:52 | 显示全部楼层 |阅读模式
有關於 V5开发板用户手册 的ADC定時觸發

例子中是用 bsp_StartAutoTimer(0, 500);    /*启动1个500ms的自动重装的定时器*/


來讀取ADC3ConvertedValue


我想問的是 有沒有中斷程序去讀取 ADC3ConvertedValue ?


因為用 bsp_StartAutoTimer(0, 500); 去讀取 , 會漏資料吧!! (每筆 ADC3ConvertedValue  不見得都讀取到)


我之前是單純寫個 TIMER中斷 每1us (取樣頻率為1M) 去讀AD資料


但看到這 ADC定時觸發例子 想說應該是更聰明的方法 結果看完這例子 ""  如果想要每筆資料都讀取該怎麼做呢?  ""
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2015-5-27 15:19:18 | 显示全部楼层
定时器触发不是设置了DMA缓冲了吗,你可以把DMA的缓冲设置的大一些。

我提供的例子比较简单,就是演示下ADC定时器触发。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2015-5-28 21:25:48 | 显示全部楼层
版主 我輸入訊號為一個正弦波 但 把值拿去畫圖後 發現不是正弦波

我是設定 取樣頻率為1M Hz 並量測 1024*10個點

以下是 ADC 與 TIMER  程式  方便幫我解惑一下嗎  謝
#define ADC3_DR_ADDRESS    ((uint32_t)0x4001224C)
uint16_t ADC3ConvertedValue[10240];

void ADC3_CH4_5_6_DMA_Config(void)
{
         DMA_InitTypeDef       DMA_InitStructure;
         GPIO_InitTypeDef GPIO_InitStructure;
   ADC_CommonInitTypeDef ADC_CommonInitStructure;        
         ADC_InitTypeDef       ADC_InitStructure;
  /* Enable ADC3, DMA2 and GPIO clocks ****************************************/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF , ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        DMA_InitStructure.DMA_BufferSize = 1024*10;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream1, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream1, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOF, &GPIO_InitStructure);


    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_8Cycles;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInit(&ADC_CommonInitStructure);


    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
                ADC_InitStructure.ADC_ScanConvMode = DISABLE;
                ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
                ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;
                ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
                ADC_InitStructure.ADC_NbrOfConversion = 1;

                ADC_Init(ADC3, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 1, ADC_SampleTime_3Cycles);

    ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);


          ADC_DMACmd(ADC3, ENABLE);
                /* Enable ADC1 --------------------------------------------------------------*/
                ADC_Cmd(ADC3, ENABLE);

                TIM1_Config();
}



void TIM1_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
   

    TIM_Cmd(TIM1, DISABLE);   
   
     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                 
    TIM_TimeBaseStructure.TIM_Period = 168000000 / 1000000 - 1;      
    TIM_TimeBaseStructure.TIM_Prescaler = 0;                       
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                     
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;           
    TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);

    TIM_Cmd(TIM1, ENABLE);                                          
   

    TIM_CtrlPWMOutputs(TIM1, ENABLE);         
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2015-5-28 22:36:30 | 显示全部楼层
所采样的正弦波幅值和频率是多少。
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2015-5-29 11:57:47 | 显示全部楼层
正弦波幅值 是  0.8V ~ 3V   (符合0~3.3 範圍)

频率是 60Hz


謝謝
回复

使用道具 举报

34

主题

112

回帖

214

积分

高级会员

积分
214
 楼主| 发表于 2015-5-30 17:31:14 | 显示全部楼层
版主  我可以問你

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;


有什麼不同嗎?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2015-6-1 09:29:24 | 显示全部楼层

回 fcdxsdxsza 的帖子

fcdxsdxsza:版主  我可以問你

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

....... (2015-05-30 17:31) 
1. DMA_Mode_Circular 是循环模式,比如你设置的DMA缓冲大小是100个,那么等DMA传输完100个后,会继续的传输,从头开始,一直这样的循环进行。

2.  DMA_Mode_Normal 是正常模式,只进行一次DMA传输,比如你设置的DMA缓冲大小是100,那么传输完100个后,就停止再传输了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 20:45 , Processed in 0.168216 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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