硬汉嵌入式论坛

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

[μCOS-III] ADC无法连续采样

[复制链接]

3

主题

11

回帖

20

积分

新手上路

啥也不会入了坑

积分
20
发表于 2020-5-14 13:17:38 | 显示全部楼层 |阅读模式
一旦使用BSP_Tick_Init();
就无法连续从ADC获取新值,只能得到一个值,不再更新
不使用BSP_Tick_Init(); 就能持续更新




void ADC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
//__IO uint16_t ADCConvertedValue;
//    /* 使能 ADC1 and GPIOC clock */
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//
// /* 配置PC2为模拟输入(ADC Channel12) */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* 配置模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* 配置为模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* 配置为模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
  /****************************************************************************   
   PCLK2 = HCLK / 2
   下面选择的是2分频
   ADCCLK = PCLK2 /8 = HCLK / 8 = 168 / 8 = 21M
      ADC采样频率: Sampling Time + Conversion Time = 480 + 12 cycles = 492cyc
                    Conversion Time = 21MHz / 492cyc = 42.6ksps.
*****************************************************************************/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);     //ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束  

/* ADC Common 配置 ----------------------------------------------------------*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;  //不用DMA
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
    ADC_CommonInit(&ADC_CommonInitStructure);

/* ADC1 regular channel 12 configuration ************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1; /* 1个转换在规则序列中 也就是只转换规则序列1  */
    ADC_Init(ADC1, &ADC_InitStructure);
/* 配置ADC1 规则通道12 channel12 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_56Cycles);
/* 使能 ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 软件启动ADC转换 */
// ADC_SoftwareStartConv(ADC1);
}


void AdcPro(void)
{
static uint16_t buf[SAMP_COUNT];
static uint8_t write;
uint32_t sum;
uint8_t i;
/* 软件启动下次ADC转换
    说明: 如果没有转换完毕就再次启动下次ADC转换会导致ADC不工作。
   每1ms执行一次该函数,转换已经完毕。
*/
buf[write] =  ADC_GetConversionValue(ADC1);

if (++write >= SAMP_COUNT)
{
  write = 0;
}
/* 下面这段代码采用求平均值的方法进行滤波
  也可以改善下,选择去掉最大和最下2个值,使数据更加精确
*/
sum = 0;
for (i = 0; i < SAMP_COUNT; i++)
{
  sum += buf[i];
}
g_usAdcValue[5] = sum / SAMP_COUNT; /* ADC采样值由若干次采样值平均 */

ADC_SoftwareStartConv(ADC1);  //使能指定的ADC1的软件转换启动功能
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-14 14:36:10 | 显示全部楼层
你的BSP_Tick_Init实现了什么,实现了个滴答定时器初始化吗?

那完全不影响ADC的。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

啥也不会入了坑

积分
20
 楼主| 发表于 2020-5-14 18:10:53 | 显示全部楼层
eric2013 发表于 2020-5-14 14:36
你的BSP_Tick_Init实现了什么,实现了个滴答定时器初始化吗?

那完全不影响ADC的。

void BSP_Tick_Init (void)
{
    CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;
   
    cpu_clk_freq = BSP_CPU_ClkFreq();                           /* 获取系统时钟  */
   
#if (OS_VERSION >= 30000u)
    cnts  = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;     
#else
    cnts  = cpu_clk_freq / (CPU_INT32U)OS_TICKS_PER_SEC;        /* 获得滴答定时器的参数  */
#endif
   
        OS_CPU_SysTickInit(cnts);                                   /* 这里默认的是最低优先级            */
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-15 08:23:13 | 显示全部楼层
DLZ 发表于 2020-5-14 18:10
void BSP_Tick_Init (void)
{
    CPU_INT32U  cpu_clk_freq;

那没影响,参考我的二代示波器代码,也有这个这种方式的代码功能。
回复

使用道具 举报

3

主题

11

回帖

20

积分

新手上路

啥也不会入了坑

积分
20
 楼主| 发表于 2020-5-15 08:46:01 | 显示全部楼层
eric2013 发表于 2020-5-15 08:23
那没影响,参考我的二代示波器代码,也有这个这种方式的代码功能。

所以是要用DMA吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-15 08:54:19 | 显示全部楼层
DLZ 发表于 2020-5-15 08:46
所以是要用DMA吗

不是,STM32有三个ADC,两路被征用做示波器双通道,还有一路就是简单的查询读取。

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 21:18 , Processed in 0.165971 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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