本科毕业设计说明书(论文) 第 28 页 共 46 页
4.5 ADC部分
4.5.1 ADC初始化
在增压流量配比控制系统中,两路差压流量信号分别被送入ADC1的通道10
(PC0引脚)和通道11(PC1引脚)进行处理,那么在AD转换之前,我们需要对这两个通道进行初始化,初始化步骤如下:
(1)开启PC口时钟,设置PC0、PC1为模拟输入; (2)使能ADC1时钟,并设置分频因子; (3)设置ADC1的工作模式;
(4)设置ADC1规则序列的相关信息; (5)开启ADC并校准; (6)使能ADC中断;
初始化的程序如下:
void Adc_Init() {
//先初始化IO口
RCC->APB2ENR|=1<<4;//使能PORTC时钟
GPIOC->CRL&=0XFFFFFF00;//PC0、1设置为模拟输入 RCC->APB2ENR|=1<<9;//ADC1时钟使能 RCC->APB2RSTR&=~(1<<9);//ADC1复位 RCC->CFGR&=~(3<<14);//分频因子清零
//SYSCLK/DIV2=12M ADCCLK设置为12M,ADC最大时钟不要超过14M,否则会 //造成ADC准确度下降! RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF;//工作模式清零,选择独立模式
ADC1->CR1|=0<<16;//独立工作模式 ADC1->CR1|=(1<<8);//工作于扫描方式 ADC1->CR1|=(1<<1);//连续转换模式 ADC1->CR2&=~(7<<17);
ADC1->CR2|=(7<<17);//软件控制转换
本科毕业设计说明书(论文) 第 29 页 共 46 页
ADC1->CR2|=1<<20;//使用外部触发(SWSTART)!!!必须使用一个事件来触发 ADC1->CR2&=~(1<<20);//右对齐 ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=1<<20;//2个转换在规则序列中 ADC1->SQR2&=2<<25;
ADC1->SQR3&=1<<20;//确定2个规则转换的转换通道号 //设置通道10,11的采样时间
ADC1->SMPR1&=0XFFFFFF00;//通道10,11采样时间清空
ADC1->SMPR1|=7<<3;//通道11采样时间是239.5周期,提高采样时间可提
//高精度
ADC1->SMPR1|=7<<0;//通道10采样时间是239.5周期,提高采样时间可提
//高精度
ADC1->CR2|=1<<0;//开启ADC
ADC1->CR2|=1<<3;//使能复位校准 while(ADC1->CR2&1<<3);//等待校准结束
//该位由软件设置以进行校准,并在校准结束时由硬件清除 ADC1->CR1|=1<<5;//使能EOC中断
MY_NVIC_Init(2,5,ADC1_2_IRQChannel,2);//抢占2,子优先级5,组2 }
该函数是包含在ADC.c源文件中的,在主程序进行初始化时直接调用就可以了。
4.5.2 读取ADC结果
因为增压流量配比系统的ADC是采用中断形式的,所以我们在进行ADC初始
化之后,ADC开始自动连续转换,我们还要编写一个ADC的中断程序用于读取ADC结果。
void ADC1_2_IRQHandler(void) {
u16 Adcbuf[2]; u8 ch;
本科毕业设计说明书(论文) 第 30 页 共 46 页
Adcbuf[ch-10]=ADC1->DR; }
该函数也是包含在ADC.c源文件中的,在主程序进行ADC初始化之后ADC1
的通道10和通道11即开始不断进行转换,当转换结束时程序便自动转入中断处理,读取ADC结果并将结果存入缓存中,等待主程序来进行读取处理,这样就可以在不打扰主程序的前提下进行AD转换。
4.6 ModBus通讯
4.6.1 STM32通用串口初始化
RS485总线占用了主控制芯片的串口1,所以我们首先要对串口1进行初始
化,具体设定通讯参数为:波特率9600,8位数据,1位停止位,无校验位。串口1初始化函数如下(这一函数是包含在usart.c源文件中的): void uart_init(u32 pclk2,u32 bound) {
float temp; u16 mantissa; u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV mantissa=temp;
//得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分 mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟 RCC->APB2ENR|=1<<14; //使能串口时钟 GPIOA->CRH=0X44444BB4;//IO状态设置 RCC->APB2RSTR|=1<<14; //复位串口1 RCC->APB2RSTR&=~(1<<14);//停止复位 //波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
本科毕业设计说明书(论文) 第 31 页 共 46 页
#ifdef EN_USART1_RX
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,4,USART1_IRQChannel,2);//抢占2,子优先级4,组2
//如果使能了接收
#endif }
这样,在主程序对串口1进行初始化时,只需要调用这个函数
(uart_init(72,9600);)就可以了。当MCU接收到上位机发送的数据时,程序便从主程序自动跳转到串口中断程序进行数据的接收,并将接收到的有效数据(地址码与本机符合的数据)存入缓存中,等待主程序读取处理。 4.6.2 Modbus-RTU协议
Modbus进行通讯传送时每一个字节的传送格式是:1位起始位,8位数据位,
1位停止位,无奇偶校验位。
一个数据包的格式如表4.1所示:
表4.1 Modbus协议数据包格式
地址码 1字节 功能码 1字节 数据区 N字节 CRC校验码 16位(2字节) 地址码为通讯传送的第一个字节,取值范围是0-255。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。每个从机都有一个唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机的号码,而从机发送的地址码表示回送的从机地址。
功能码:通讯传送的第二个字节。Modbus通讯规约定义功能号为1到127。本系统只是利用其中的很少一部分功能码。作为主机发送,通过功能码告诉从机执行什么动作;作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已经响应主机进行操作。如果从机发送的功能码的最高位为1(即功能码大于127),则表明从机没有响应操作或发送出错。增压流量配比控制系统用到的功能码如表4.2所示:
表4.2 Modbus协议功能码
本科毕业设计说明书(论文) 第 32 页 共 46 页
功能码 含义 03H 读数据 06H 写数据 数据区:这是增压流量配比控制系统与上位机PLC之间的共享数据。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。在增压流量配比控制系统中,数据区总共有六个字节,前两个字节表示管网水流量与水箱水流量之和,中间两个字节表示管网水流量与水箱水流量之比,后面两个字节表示电机速度。增压流量配比控制系统收到上位机发送过来的数据,执行相应动作,并将本机状态反馈给上位机。
CRC校验码:两字节的错误校验码。生成CRC16校验码的程序流程如下[15]: (1)预置一个16位寄存器为0XFFFF,称为CRC寄存器;
(2)把数据帧中的第一个8位字节与CRC寄存器的低字节进行异或运算,结 果存回CRC寄存器;
(3)把CRC寄存器向右移一位,最高位填以0,最低位移出并检测; (4)若移出的最低位为1,则将CRC寄存器与一个预设的固定值(0XA001)进 行异或运算;
(5)重复第3步和第4步,直至移出8位;
(6)重复第2步到第5步,处理下一个8位字节,直到所有的字节处理结束。 相关程序如下:
unsigned int CRC16_check(unsigned char *fp_CRC,unsigned char count) {
unsigned int CRC=0XFFFF; unsigned char CRC_count;
for(CRC_count=0;CRC_count int i; CRC=CRC^*(fp_CRC+CRC_count); for(i=0;i<8;i++) { if(CRC&1) 百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典教育范文增压供水流量配比柔性控制电气系统设计与开发(9)在线全文阅读。
相关推荐: