[STM8] STM8L151 AD取样成功 实用程序

[复制链接]
11910|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
sun1238898 发表于 2014-11-24 10:27 | 显示全部楼层
CLK_PCKENR2 |= CLK_ADC1; //给ADC1喂时钟,否则ADC不工作。,这个地方是否应该改为CLK_PCKENR2 |= 1<<CLK_ADC1;我实测需要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

26

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部