教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

张华伟-基于STM32F4ARM单片机精确温控的设计与实现(8)

来源:网络收集 时间:2026-05-03
导读: 附录 RG_PID_Calc(); if(RG_PID.FDUk>=1) { } else { RG_stop(); if(RG_PID.FDUk>=999) { } RG_PID.FDUk=999; RG_PID.FDUk=1000-RG_PID.FDUk; RG_hot(RG_PID.FDUk); } } //AD转换程序 #include \#include #include

附录

RG_PID_Calc();

if(RG_PID.FDUk>=1) { } else {

RG_stop();

if(RG_PID.FDUk>=999) { }

RG_PID.FDUk=999;

RG_PID.FDUk=1000-RG_PID.FDUk; RG_hot(RG_PID.FDUk);

} }

//AD转换程序 #include \#include #include \#include \#include \#include \

#define PUTCHAR_PROTOTYPE intfputc(intch, FILE *f) #define PRINT_ON_LCD

#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C) //ADC1 DR寄存器基地址

ADCConvertedValue的低12位有效 __IO uint16_t ADC1ConvertedValue = 0; __IO uint32_t ADC1ConvertedVoltage = 0;

31

附录

void ADC1_CH0_DMA_Config(void) //选择ADC1的通道0 映射在DMA2的数据流0 ; {

ADC_InitTypeDefADC_InitStructure;

ADC_CommonInitTypeDefADC_CommonInitStructure; DMA_InitTypeDefDMA_InitStructure; GPIO_InitTypeDefGPIO_InitStructure; /* Enable ADC1, DMA2 and GPIO clocks ****************************************/

// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);

// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Configure PC.03 (ADC Channel13) as analog input -------------------------*/ // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_Init(GPIOC, &GPIO_InitStructure);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);

/* DMA2 Stream0 channel0 configuration **************************************/ DMA_InitStructure.DMA_Channel = DMA_Channel_0;

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

DMA_InitStructure.DMA_BufferSize = 1; //DMA_InitStructure.DMA_BufferSize =

32

附录

CH_NUM;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High;

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); DMA_Cmd(DMA2_Stream0, ENABLE); /* ADC Common Init

**********************************************************/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; // 不要超过36M ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

ADC_CommonInit(&ADC_CommonInitStructure);

/* ADC1

Init****************************************************************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换开启; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //启动转换方式

33

附录

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐方式 ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE);

/* Start ADC1 Software Conversion */ ADC_SoftwareStartConv(ADC1); }

unsigned intGetADCValue(void) {

//设置指定ADC的规则组通道,一个序列,采样时间

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); }

//PT100温度值转换 void temperature_pt100(void) {

unsigned int nm ;

float tem_pt100,tem_pt,turn_v,turn_v1,turn_v2 = 0; turn_v1 = GetADCValue();

for(nm=0;nm < 1000;nm++) //限幅滤波 ADC_SoftwareStartConv(ADC1);

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 return ADC_GetConversionValue(ADC1);

//使能指定的ADC1的软件转换启动功能

34

附录

{ }

ADC1ConvertedValue = turn_v2 / 1000 ; tem_pt = ADC1ConvertedValue ;

turn_v = GetADCValue(); // AD 转换PT100的电阻值 if( ((turn_v - turn_v1 ) < 2) || (turn_v1 - turn_v )< 2) //加热时 ; { } else { }

turn_v2 = turn_v2 + turn_v;

turn_v = turn_v ; turn_v = turn_v1;

// tem_pt=tem_pt/65.536; //1℃相差0.373847mV; 1mV相差2.674891℃

tem_pt = tem_pt / 4.096 ;

// tem_pt=tem_pt*5; //mV }

tem_pt=tem_pt*3.3;

tem_pt=tem_pt/63.4; //放大前电位差(mv) tem_pt=89.189189-tem_pt; //PT100的压降 tem_pt=(5600*tem_pt)/(3300-tem_pt); //PT100阻值 tem_pt100=R2T(tem_pt); tem_pt100=tem_pt100+0.7; tem_real = tem_pt100 ;

35

…… 此处隐藏:2682字,全部文档内容请下载后查看。喜欢就下载吧 ……
张华伟-基于STM32F4ARM单片机精确温控的设计与实现(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/453557.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)