用PB口的AIN功能,实现AD转换。一个旋钮式电位器从PB3(AIN3)输入,转换后的信号经PD3(TIM2_CC2)输出至LED。想要的现象:调节电位器,LED的亮度会随之变化。/***************************************
**文件名称:main.c
**外部晶振:8MHz
**CPU型号:stm8s105s4
**端口说明:LED-------PD3(TIM2_CC2)
** 电位器----PB3(AIN3)
****************************************/
#include"stm8s105c_s.h"
unsigned int AD_Value; // AD转换后的值存放在这里
void CLK_Init(void)
{
CLK_CKDIVR &=~(0x10); // fHSI = fHSI RC/2=8MHz
CLK_CKDIVR |=0x01; /* fCPU = fMASTER/2=1MHz
默认上电后,主时钟使用HSI RC/8=2MHz */
}
void GPIO_Init(void)
{
PD_DDR |=0x08;
PD_CR1 |=0x08; // 配置PD3为推挽输出
PD_CR2 =0x00; // 输出速率=2MHz
}
void TIM2_Init(void)
{
TIM2_PSCR =0x00; // TIM2不分频
TIM2_CR1 |=0x01; // 使能TIM2计数器
TIM2_ARRH =0x00;
TIM2_ARRL =0xFF; // 计数重装值=256
// 控制LED的亮度
TIM2_CCR2 =0x00;
TIM2_CCMR2 |=0x70; // TIM2配置为PWM2模式
TIM2_CCER1 |=0x30; // CC通道配置为输出使能、低有效
}
void ADC_Init(void)
{
ADC_CR1 =0x00; // fADC = fMASTER/2,复位即进入低功耗模式
ADC_CR2 =0x00; // 默认左对齐
ADC_CSR =0x03; // AD输入通道 =PB3(AIN3)
}
void LED_Control(void)
{
unsigned int i;
ADC_CR1 |=0x01; // 开启ADC
i=6;
while(i--);
ADC_CR1 |=0x01; // 从低功耗模式中唤醒ADC
while(!(ADC_CSR &0x80)); // 等待转换完成
AD_Value =((((unsigned int)ADC_DRH)<<2)+ADC_DRL); // 结果送入AD_Value缓冲区
TIM2_CCR2H =0x00;
TIM2_CCR2L =(unsigned char)(AD_Value>>2); // 结果由PD3口送出至LED
}
void main(void)
{
_asm("sim");
CLK_Init();
GPIO_Init();
TIM2_Init();
ADC_Init();
_asm("rim");
while(1)
{
LED_Control();
}
}
|