微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 如何设计基于STM8的ADC0832采集及蓝牙通信系统?

如何设计基于STM8的ADC0832采集及蓝牙通信系统?

时间:09-27 来源:互联网 点击:

最近在淘宝逛的时候发现了一款单片机,STM8。相比之前一直使用的也是8位的AVR相比,感觉STM8更为强大,芯片特点如下:

内核:具有3级流水线的哈佛结构、扩展指令集

程序存储器:8K字节Flash;RAM:1K字节

数据存储器:640 字节真正的数据EEPROM;可达30万次擦写

更重要的一点就是STM8系列若使用库编程的话,可以方便的不同芯片的程序移植。甚至可以方便的移植到STM32上面,大大减轻了更新硬件的重写程序的工作量。

ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。(简述和图片均来之百度百科)

  

本文适合STM8控制ADC0832,程序是使用库编程,编译工具IAR。其实STM8也自带ADC转换模块了......

本程序还包括蓝牙串口通信,方便将得到数据从串口输出,我是编写了安卓上位机的app,方便在安卓上面显示图像。

程序还是用了定时器TIM4,确保每次采样的间隔大致相等,对之后的数据处理提供了基础。

先介绍核心mian.c文件,主要功能是初始化串口UART1,定时器TIMER4,还有一个发送16进制的函数。其中发送完数据再发送一个字符’U’作为一个数据的结束(你也可以自己定义)。这里说说为什么要选用16进制,而不是10进制,STM8速度有限,为了减少单指令操作,程序用了移位操作,这样可得到16进制每位数值,在发送到安卓上位机,上位机运算速度快,再转化成10进制,这样可以资源合理分配。

main.c程序:

#include "stm8s.h"

#include "stm8s_it.h"

uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

uint8_t i=0;

//串口UART1初始化

void Init_UART(void)

{

//默认初始化

UART1_DeInit();

//设置波特率9600 8位数据 1位停止位 无校验 外部时钟不可用 模式接收发送

UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

//设置接收寄存器溢出中断

UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

}

//定时器TIM4初始化

void Init_Timer4(void)

{

//1ms中断一次

TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);

/* Clear TIM4 update flag */

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

/* Enable update interrupt */

TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);

TIM4_Cmd(ENABLE);

}

//发送字节

void Send(uint8_t dat)

{

//检查并等待发送寄存器是否为空

while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));

//发送字节

UART1_SendData8(dat);

}

//发送16位16进制

void UART1_mysend16hex(u16 dat)

{

Send(HexTable[(dat>>12)&0x0f]);

Send(HexTable[(dat>>8)&0x0f]);

Send(HexTable[(dat>>4)&0x0f]);

Send(HexTable[(dat)&0x0f]);

}

//发送8位16进制

void UART1_mysend8hex(uint8_t dat)

{

Send(HexTable[(dat>>4)&0x0f]);

Send(HexTable[(dat)&0x0f]);

Send('U');

}

void main()

{

//初始化

Init_UART();

Init_Timer4();

//中断开启

enableInterrupts();

while(1)

{

}

}

//这个必须加上 不然会报错 估计是库的要求

#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)

{

while (1)

{

}

}

#endif

接下来说说中断函数表stm8s_it.c

其中只要选用两个中断函数就可以了:

INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) 接收寄存器溢出中断

里面添加安卓上位机发送过来的数据的处理程序,我这里写的是ADC0832通道选择的判断。

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) 定时器4计数器溢出中断

里面添加初始化ADC0832和ADC0832数据读取并UART1发送到安卓上位机。

stm8s_it.c程序:

#include "stm8s_it.h"

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top