OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4864|回复: 1

新手,测试stm8s105k4的ADC,为什么ADC_DRH一直为0?

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-12-5
在线时间
0 小时
发表于 2014-12-19 11:17:46 | 显示全部楼层 |阅读模式
5金钱
可变电阻左右两脚电源+、-,中间脚接PD5,旋动时万用表测得PD5电压是有变动的。
但调试时ADC_DRH一直为0,是哪里出了问题了?
是硬件接错了还是代码有问题?
都搞了两天了,不懂……

代码如下,求解!

#include <stm8s105k4.h>

unsigned char timer_count;
unsigned char AD_Value;

void CLK_HSI_Init(void)
{
CLK_ECKR = 0X00;//Disable extern HSE
CLK_ICKR = 0X01;//enable HSI
CLK_SWR = 0XE1;//chose HSI 16MHZ
CLK_CKDIVR = 0X18; //Fmaster=16MHZ/8    Fcpu= Fmaster=2MHZ
}

void GPIO_Init(void)
{
PE_DDR |= 0x20;                   //PE5接LED的
PE_CR1 |= 0x20;
PE_CR2 &=~(0x20);
}


void Tim4_Init(void)              //TIM4:10MS产生一次溢出中断
{   
    TIM4_IER = 0x00;           //禁止中断
    TIM4_PSCR =0x07;        //计数器时钟=主时钟/2^7=2Mhz/128 (计数器周期64us)
    TIM4_CNTR =0;              //设定计数器的初值    
    TIM4_ARR  =156;           //设定重装载时的寄存器值(10ms/64us=156.25)
    TIM4_EGR = 0x01;         //计数器重新初始化并产生寄存器更新
    TIM4_CR1 = 0x01;         //允许计数器工作    
    TIM4_SR &= 0xFE;         //清除更新标志
    TIM4_IER = 0x01; ;        //允许更新中断
}

 /***************ADC初始化:
void ADC_Init(void)
{
   ADC_CR2  = 0x00;//禁止外部触发转换(选择软件启动)、数据左对齐
   ADC_CR1  = 0x00;//FADC=FMASTER/2、单次转换、ADC转换开关关    
   ADC_TDRL = 0x20;//关闭 (AIN5)施密特触发器
}

//ADC单次转换:
void ADC_check(void)
{
  unsigned char i;
  ADC_CSR  = 0x05;                //选择通道AIN5
  ADC_CR1 |= 0x01;                // First set ADON to power on the ADC module.    
  i = 12;                                    //Wait >7us to ensure the ADC power on finished.
  while(i--); 
  ADC_CR1 |= 0x01;                // Set ADON again to start AD convert.          
  while(!(ADC_CSR & 0x80));    //Waiting for AD convert finished (EOC=1).
  AD_Value=ADC_DRH;            //取高8位
ADC_CSR  &= 0x7F;                //第8位EOC置0
}

main()
{
CLK_HSI_Init();
GPIO_Init();
Tim4_Init();
ADC_Init();

_asm("rim");                // 允许CPU全局中断
while (1) ;
}

@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)
{   
   timer_count++;//10ms一次
   TIM4_SR &= 0xFE; // 清除更新标志
ADC_check();
if (timer_count>AD_Value)     //以测得的数值控制LED闪烁频率
{
PE_ODR^=0x20;                  //LED取反
timer_count=0;
}
return;
}



最佳答案

查看完整内容[请看2#楼]

不好意思,参考的引脚图弄错了,这个芯片PD5不是AIN5通道,我靠,搞了我三天……
为所有员工都能买车买楼而奋斗!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-12-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 11:17:47 | 显示全部楼层
不好意思,参考的引脚图弄错了,这个芯片PD5不是AIN5通道,我靠,搞了我三天……
为所有员工都能买车买楼而奋斗!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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