第一步:stm8 ADC简介
stm8的ADC1和ADC2是10位逐次比较型模拟数字转换器。A/D转换的各个通道可以执行单次和连续的转换模式。
stm8S103k5引脚图如下:
stm8
可以看见它只有16/15/14/13引脚是ADC的引脚,分别是AIN0、AIN1、AIN2、AIN3。都是ADC1。
第二步:ADC相关寄存器说明
基本还是和前几节一样都是直接截图的数据手册。
第三步:具体实现
实现功能:PB0脚AIN0,当接3.3V电压时点亮LED,接地时LED熄灭,没有可调电阻和可调电源,就这么操作了。
#include "IOSTM8S105K4.h"
#define u16 unsigned int
#define u8 unsigned char
void System_Init(void)
{
CLK_SWR = 0xE1; //选择高速内部时钟HSI为主时钟
CLK_ICKR |= 0x01; //高速内部HSI时钟使能
while(!(CLK_ICKR&0x02)); //等待内部高速HSI就绪
CLK_CKDIVR = 0x18; // Fhsi = Fhsi = Fcpu = Fmaster = 2MHz
}
/*延时xms函数@ HSI 2MHz*/
void delay_ms(u16 xms)
{
u16 i,j;
for(i=xms;i>0;i--)
for(j=330;j>0;j--)
{
asm("nop");
}
}
void Gpio_Init(void)
{
/*PE5设置为推挽输出*/
PE_DDR|=0x20;
PE_CR1|=0x20;
PE_CR2|=0x00; //最大为10MHz
}
/*ADC初始化*/
void Adc_Init(void)
{
/*PB0 设置为悬浮输入*/
PB_DDR &=0xFE; //PB0输入模式
PB_CR1 &=0xFE; //PB0浮空输入
PB_CR2 &=0xFE; //PB0禁止外部中断
/*开启ADC时钟*/
CLK_PCKENR2 |= 0x08; //开启ADC时钟 ADC时钟默认是开启的,可不设置
/*设置ADC时钟、转换模式、数据对齐格式和通道*/
ADC_CR1 = 0x00; //ADC时钟1MHz,单次转换,关闭ADC 默认如此
ADC_CR2 = 0x00; //数据左对齐,禁止外部触发,禁止扫描模式 默认如此
ADC_CSR = 0x00; //选择通道0 AIN0 默认如此
}
/*获取10位的ADC转换结果*/
u16 Get_Adc_Result(void)
{
u8 ADC_H,ADC_L;
u16 ADC_temp;
ADC_CR1 |= 0x01; //启动ADC 启动ADC电源
delay_ms(1); //延时1ms 等待ADC启动
ADC_CR1 |= 0x01; //再次启动ADC转换
while((ADC_CSR&0x80) == 0); //等待ADC转换结束
ADC_H = ADC_DRH; //左对齐 先读高八位
ADC_L = ADC_DRL; //读取低位值
ADC_temp = (ADC_H << 8) +ADC_L; //两个八位数据合并成一个16位数据
return ADC_temp; //返回10位ADC转换结果
}
int main( void )
{
u16 temp;
System_Init();
Gpio_Init();
Adc_Init();
while (1)
{
temp = Get_Adc_Result();
if(temp>=800) //如果ADC转换结果大于800
{
PE_ODR = 0x00; //PE5口的LED点亮
}
else PE_ODR = 0xFF; //否则PE5口的LED不点亮
delay_ms(800); //延时800ms
}
}
上一篇:IAR for STM8 研究
下一篇:STM8的启动过程(基于IAR)
推荐阅读最新更新时间:2024-03-16 16:04