STM8S系列基于STVD开发,ADC不同精度采样示例
- 📌相关篇《STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例》
✨本工程以上面一篇的工程为模板,在此基础上实现ADC电压采样。
- 🎬📽🎞工程编译和烧录以及调试信息过程演示:
🛠功能说明
📝本案例采用ADC单次采样模式,本示例代码提供不同精度的采集方式,根据需求选择对应的接口函数。
📚ADC功能介绍
🔖STM8S903K3/F3系列产品包含10位逐次逼近A /D转换器(ADC1),具有多达7个外部和1个内部多路输入通道.
- 输入电压范围:0 ~ VDD
- 转换时间:14个时钟周期
- 单、连续和缓冲连续转换模式
- 缓冲区大小(n x 10位),其中n =输入通道数
- 扫描模式,用于单个和连续转换一个频道序列
- 模拟看门狗能力,具有可编程上下限阈值
- AIN7通道上的内部参考电压
- 模拟看门狗中断
- 外部触发输入
- 从TIM1 TRGO触发
- 转换结束中断
📓工程架构
- 🍁采用模块化设计
📖主程序代码实现
🌿采集的引脚是PD3,AIN4的电压值
void main()
{
unsigned int VALUE;
CLK_CKDIVR = 0x00; //主频16MHz
_asm("SIM");
GPIO_Init();
ADC_GPIO_Init();
UART1_Init(115200);
Init_Timer5();
_asm("RIM");
while (1)
{
TIM_Delay_ms( 800);
ADC_CH_Init(3);
if(ADC_flag == 1)
{
// VALUE = ADC1_GetConversionValue();//8bit精度adc
VALUE = ReadVol_CH3();//10bit精度
My_print_Information_uint("ADC_Value= ", VALUE);
ADC_flag = 0; // ADC中断标志 置0
}
}
}
- 📋中断号
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap */
{0x82, NonHandledInterrupt}, /* irq0 */
{0x82, NonHandledInterrupt}, /* irq1 */
{0x82, NonHandledInterrupt}, /* irq2 */
{0x82, NonHandledInterrupt}, /* irq3 */
{0x82, NonHandledInterrupt}, /* irq4 */
{0x82, NonHandledInterrupt}, /* irq5 */
{0x82, NonHandledInterrupt}, /* irq6 */
{0x82, NonHandledInterrupt}, /* irq7 */
{0x82, NonHandledInterrupt}, /* irq8 */
{0x82, NonHandledInterrupt}, /* irq9 */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, NonHandledInterrupt}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, TIM5_UPD_OVF_IRQHandler}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, NonHandledInterrupt}, /* irq15 */
{0x82, NonHandledInterrupt}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, UART1_Receive_Interrupt}, /* irq18 */
{0x82, NonHandledInterrupt}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, ADC_Handle}, /* irq22 */
{0x82, NonHandledInterrupt}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};
- 📑不同精度接口函数
uint16_t ADC1_GetConversionValue(void)
{//8BIT精度adc
uint16_t temph = 0;
uint8_t templ = 0;
/* Read MSB first*/
temph = DATAH; // 读出ADC结果的高8位
/* Then read LSB */
templ = DATAL; // 读出ADC结果的低8位
DATAH = (u16)((u16)((u16)templ << 6) | (u16)((u16)temph << 8));
ADC_CR1 = ADC_CR1 | 0x01;
return ((u16)temph);
}
u16 ReadVol_CH3( void )
{//10BIT精度adc
u16 voltage = 0;
if( ADC_flag )
{
ADC_flag = 0;
voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1,
};
return voltage;
}
✅工程源码
链接:https://pan.baidu.com/s/179Hjd-OGmSUzaprnd5aVSA
提取码:xil8