打印
[STM8]

stm8l152 adc初始化与引脚选择

[复制链接]
12308|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yilichen|  楼主 | 2010-8-7 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位帮帮忙:
下面是我对ADC的初始化,但是不能工作,现在还不会做引脚的选择。
/*************************************
ADC单次转换初始化
***************************************/
void ADCInit(void)
{
  CLK_PCKENR2 |= (1<<0);
  //ADC1_CR1 = 0x09;//单次转换,启动ADC(是否要启动ADC,待定),允许转换完成中断
// ADC1_CR2 = 0x58;//时钟不分频,下降沿触发,使用第3个触发(定时器2)4个采样时钟
  //RI_IOSR1 |= (1<<1);
  //RI_ASCR1 &= (~(1<<1));
  //RI_IOCMR1 |= (1<<1);
  ADC1_CR1 = 0x00;
  ADC1_CR2 = 0;
  ADC1_CR3 = 24;
  //ADC1_TRIGR4 = 24;
  ADC1_TRIGR1 = 0;
  ADC1_SQR1 = 0x80;//OFF DMA
  ADC1_CR1 = 0x01;
  ADC1_CR1 |= (1<<1);
  while(!(ADC1_SR & (1<<0)));
  //ADC1_CR3 = 0;//默认选择0通道
}

求一下可用的ADC例程或是请大家赐教一下如何使用ADC。谢谢!
我的邮箱:123456chenyili@163.com
}
沙发
IJK| | 2010-8-9 13:36 | 只看该作者
这是我的部分代码,使用PC7(ADC_3)做AD输入,使用了STM8L的库,可以工作,供参考:

  // Enable ADC clock
  CLK->PCKENR2 |= CLK_PCKENR2_ADC;
  // Set PC7 as Input floating no INT - ADC_3
  GPIO_Init(GPIOC, GPIO_Pin_7, GPIO_Mode_In_FL_No_IT);

  // de-initialize ADC
  ADC_DeInit();
  // ADC configuration ---------------------------------------//
  ADC_Init(ADC_Channel_3, ADC_ConversionMode_Single,
           ADC_Resolution_12Bit, ADC_Prescaler_1);
  // SampleTime: 159 cycles
  ADC_SamplingTimeConfig(ADC_Group_SlowChannels, ADC_SamplingTimeCycles_159);
  // enable ADC
  ADC->CR1 |= ADC_CR1_ADON;

  // start ADC convertion by software
  ADC->CR1 |= ADC_CR1_START;
  // wait until end-of-covertion
  while( ADC_GetFlagStatus(ADC_FLAG_EOC) == 0 )
    ;
  // read ADC convertion result
  value = ADC_GetConversionValue();

使用特权

评论回复
板凳
zhangyong1818| | 2010-8-9 14:52 | 只看该作者
2楼的程序我试了一下 ,不行啊!死在while(ADC_Getflagstatus(ADC_FLAG_EOC)==0);  估计AD就没转换,怎么会一直都不结束转换!疑问

使用特权

评论回复
地板
zhangyong1818| | 2010-8-9 17:00 | 只看该作者
GPIO_Init(GPIOD,GPIO_Pin_4,GPIO_Mode_In_FL_No_IT );
                /*Enable ADC1 clock */
                CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
                /*初始化AD*/
                ADC_DeInit(ADC1);
               
                //CLK->PCKENR2 |= CLK_PCKENR2_ADC;
                /* Initialize and configure ADC1 */
                ADC_Init(ADC1, ADC_ConversionMode_Single,
             ADC_Resolution_12Bit, ADC_Prescaler_1);
               
                                         
                ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,
                                       ADC_SamplingTime_384Cycles);
                                /* Enable ADC1 Channel 10*/
                ADC_ChannelCmd(ADC1,ADC_Channel_10, ENABLE);
                //ADC_DMACmd(ADC1,ENABLE);
                ADC_SoftwareStartConv(ADC1);
                ADC_Cmd(ADC1, ENABLE);

使用特权

评论回复
5
zhangyong1818| | 2010-8-9 17:01 | 只看该作者
不行啊 ,求高人指点!

使用特权

评论回复
6
yilichen|  楼主 | 2010-8-9 21:09 | 只看该作者
先谢过各位。我试试。

使用特权

评论回复
7
zhangyong1818| | 2010-8-10 09:05 | 只看该作者
个人感觉 这个芯片的AD转化不准确!
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE)
                ADC_DeInit(ADC1);
                /* Initialize and configure ADC1 */
                ADC_Init(ADC1, ADC_ConversionMode_Single,
             ADC_Resolution_12Bit, ADC_Prescaler_1);
                ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,
                                       ADC_SamplingTime_384Cycles);
                                /* Enable ADC1 Channel 10*/
                ADC_ChannelCmd(ADC1,ADC_Channel_10, ENABLE);
                //ADC1->SQR[regindex] |= (uint8_t)(ADC_Channels);
                //ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
                ADC_VrefintCmd(ENABLE);
                ADC_Cmd(ADC1, ENABLE);这是AD的初始化
这是主程序所用的内容:
                               ADC_SoftwareStartConv(ADC1);
                                               //delay(1000);
                        while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0 );
                             j=ADC_GetConversionValue(ADC1);

                        if(j>0x00FF)   
                                {
                                  ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
                                        start_work( );
                                        //ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
                                }

使用特权

评论回复
8
zhangyong1818| | 2010-8-10 09:22 | 只看该作者
刚开始我把这句:ADC_SoftwareStartConv(ADC1);放在初始化里面了。我死活读取到AD数据寄存器里面的值;很是郁闷,最后我把上面那句开始转换 换个位置,可以读取值,但是不准确。我认为既然是单次转换,一次转换结束他也应该把一次转换的结果存到计数器里面等待读取。然后给个结束标志!单次转换应该很简单啊,但是很不理想!

使用特权

评论回复
9
zhangyong1818| | 2010-8-10 09:48 | 只看该作者
ADC_DMACmd(ADC1,DISABLE);加上这一句就好多了  呵呵!

使用特权

评论回复
10
IJK| | 2010-8-10 11:05 | 只看该作者
根据我的实际使用,stm8l152的AD精度挺高。

使用特权

评论回复
11
yilichen|  楼主 | 2010-8-10 11:39 | 只看该作者
请问10楼,有没有直接操作寄存器的ADC例程。有的话,给我发一份。
我的邮箱:chenyili2007@qq.com
谢谢。

使用特权

评论回复
12
yilichen|  楼主 | 2010-8-10 11:43 | 只看该作者
请问zhangyong1818可否将你实验的程序发一份给我。谢谢。
我的邮箱:chenyili2007@qq.com

使用特权

评论回复
13
zhangyong1818| | 2010-8-10 12:46 | 只看该作者
单步执行程序时我只能看到ADC中高位DRH的值为0d   DRL值为xx:   不知道为什么?

使用特权

评论回复
14
zhangyong1818| | 2010-8-10 13:50 | 只看该作者
经过同事的指点,我把AD转换的结果在LCD显示出来了,挺准确,冤枉芯片了。不过在初始化配置上还是存在疑问。。。。。。。。

使用特权

评论回复
15
CrazyST| | 2011-3-29 17:32 | 只看该作者
楼主。
//ADC1_CR3 = 0;//默认选择0通道
这个通道是用来选择模拟看门狗通道的!不信你再看看手册。
[ADC的转换通道在SQRx寄存器里选择!无论是单次模式还是连续模式!

使用特权

评论回复
16
xfh168168| | 2011-5-17 08:31 | 只看该作者
15楼正解

使用特权

评论回复
17
yinyangdianzi| | 2011-5-20 13:17 | 只看该作者
一大堆代码,,看不懂

使用特权

评论回复
18
avb888| | 2011-5-26 16:15 | 只看该作者
请问哪位高手有STM8L151 ADC应用实例?

使用特权

评论回复
19
fjsnhxzsx| | 2011-8-3 10:14 | 只看该作者
问下大伙,有没有STM8L的技术交流群?若无的话,建议哪位高手建个群,这样可以方便大家学习交流哦

使用特权

评论回复
20
aihe| | 2011-8-3 16:36 | 只看该作者
请问哪位高手有STM8L151 ADC应用实例?
avb888 发表于 2011-5-26 16:15

库文件里面有例程

使用特权

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

本版积分规则

0

主题

8

帖子

1

粉丝