打印
[STM8]

STM8L151 AD取样成功 实用程序

[复制链接]
11325|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
solarmax1969|  楼主 | 2012-8-24 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
保证能用的ADC程序贡献给大家。

随后几天本人将学习产生PWM波形,哪位前辈的程序也请贡献下!!


/***********************************************************
**文 件 名:sys.c
**创建时间:2012/08/10
**作    者:JIM XUAN
************************************************************
**功    能: 处理单片机核心资源的函数
**备    注: 采用内置的RC=16Mhz振荡器 ,默认8分频,SysClk=2mHZ                                               
**修    改:
************************************************************
*/
void ADC_Init(void)
{
CLK_PCKENR2 |= CLK_ADC1; //给ADC1喂时钟,否则ADC不工作。
ADC1_CR1 = 0x01 ;//开启ADC电路 + 单次取样
ADC1_CR2 = 0b10000010; //0..23通道,取样16分频
ADC1_CR3 = 0b01000000; //24,TS,Vref 通道,取样16分频
}
usint AD(unsigned char channel)
{
  unsigned int k =0;
unsigned char i=0;
unsigned char j=0;
CLI(); //这句放在 For内不行
//复杂的选择ADC1 通道。单次取样用ADC1_SRQx寄存器,请仔细看说明书。
ADC1_SQR4 = ADC1_SQR3 = ADC1_SQR2 = ADC1_SQR1 = 0;
if (channel<=7)
  ADC1_SQR4 |= (1<<channel);
else if (channel<=15)
  ADC1_SQR3 |= (1<<(channel-8));
else if (channel<=23)
  ADC1_SQR2 |= (1<<(channel-16));
k=0;
for (i=0  ; i<5  ; i++)
{
  ADC1_CR1 |= (1<<START);
  for (j=0  ; j<100; j++); //简单延时下
  while ((ADC1_SR & (1<<EOC))==0); //等待取样结束
  ADC1_SR &= (~(1<<EOC));          //马上清标志位
  if (i>0) //废弃第一次取样
   k += (unsigned int)((unsigned int)(ADC1_DRH<<8)+(unsigned int)(ADC1_DRL)) ;
}
k  /= 4 ;// 4次累计平均数
SEI();

return (unsigned int)k;
}

-----------------------------
/***********************************************************
**文 件 名:SM_STM8L151_REGS.h
**创建时间:2012/08/10
**作    者:JIM XUAN
************************************************************
**功    能:处理单片机核心资源的定义,Bit标识符
**备    注:                                                
**修    改:
***********************************************************/
#ifndef __SM_STM8L151_REGS_H
#define __SM_STM8L151_REGS_H

/*  Peripheral clock gating register 1 (CLK_PCKENR1) */
#define CLK_DAC    7
#define CLK_BEEP   6
#define CLK_USART1 5
#define CLK_SPI1   4
#define CLK_I2C1   3
#define CLK_TIM4   2
#define CLK_TIM3   1
#define CLK_TIM2   0
/*  Peripheral clock gating register 2 (CLK_PCKENR2) */
#define CLK_BOOTROOM 7 //
#define CLK_COMP12 5
#define CLK_DMA1   4
#define CLK_LCD    3
#define CLK_RTC    2
#define CLK_TIM1   1
#define CLK_ADC1   0
/*  ADC1  ADC1_CR1 */
#define OVERIE 7
#define RES1   6
#define RES0   5
#define AWDIE  4
#define EOCIE  3
#define CONT   2
#define START  1
#define ADON   0
/* ADC1_CR2 */
#define PRESC 7
#define TRIG_EDGE1 6
#define TRIG_EDGE0 5
#define EXTSEL1    4
#define EXTSEL0    3
#define SMTP12     2
#define SMTP11     1
#define SMTP10     0
/* ADC1_CR3 */
#define SMTP22     7
#define SMTP21     6
#define SMTP20     5
#define CHSEL4     4
#define CHSEL3     3
#define CHSEL2     2
#define CHSEL1     1
#define CHSEL0     0
#define ADC1_VREFINT 0b00011100  
#define ADC1_TS      0b00011101
/* ADC1_SR */
#define OVER 2 //overrun flag
#define AWD  1 //Analog watchdog flag,电压过高or过低。可定义高低阀值。
#define EOC  0 //End of conversion

#endif
沙发
mmuuss586| | 2014-4-21 16:43 | 只看该作者
谢谢分享

使用特权

评论回复
板凳
gonggu8181| | 2014-4-24 07:52 | 只看该作者
精度怎么样

使用特权

评论回复
地板
shcdz| | 2014-5-17 17:56 | 只看该作者
STM8L151C6T6 现货35K 低价出货,深航春电子,137-143-27748  QQ7927-65998

使用特权

评论回复
5
sun1238898| | 2014-11-24 10:27 | 只看该作者
CLK_PCKENR2 |= CLK_ADC1; //给ADC1喂时钟,否则ADC不工作。,这个地方是否应该改为CLK_PCKENR2 |= 1<<CLK_ADC1;我实测需要的。

使用特权

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

本版积分规则

0

主题

26

帖子

2

粉丝