#define GLOBLE_VAR#include includesh 包含总头文件----------------------------------------------------------------------声明使用到的内部函数mainc使用的内部函数声明处void Delay_msuint16_t u16ms;float Regression_Ext_Tempuint
#define GLOBLE_VAR #include "includes.h" //包含总头文件
//---------------------------------------------------------------------- //声明使用到的内部函数 //main.c使用的内部函数声明处 void Delay_ms(uint16_t u16ms); float Regression_Ext_Temp(uint16_t tmpAD); //环境温度AD值转为实际温度 float Regression_MCU_Temp(uint16_t mcu_temp_AD); //MCU温度AD值转为实际温度
//---------------------------------------------------------------------- //主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿) int main(void) { //(1)======启动部分(开头)========================================== //(1.1)声明main函数使用的局部变量 uint32_t mMainLoopCount; //主循环次数变量 uint8_t mFlag; //灯的状态标志 uint32_t mCount; //延时的次数 uint32_t mLightCount; //灯的状态切换次数 uint16_t num_AD1; uint16_t num_AD2; uint16_t num_AD3; uint16_t num_AD1_filtered; uint16_t num_AD2_filtered; uint16_t num_AD3_filtered; uint16_t num_AD1_diff; uint16_t num_AD2_diff; uint16_t num_AD3_diff; uint16_t num_AD1_last; uint16_t num_AD2_last; uint16_t num_AD3_last; //(1.2)【不变】关总中断 DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
mFlag='A';
mLightCount=0; //灯的闪烁次数
mCount=0;//记次数
num_AD1_last = adc_ave(ADC_CHANNEL_1,8); //初始化上一次的ADC值
num_AD2_last = adc_ave(ADC_CHANNEL_15,8);
num_AD3_last = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
adc_init(ADC_CHANNEL_1,AD_SINGLE); //初始化ADC通道1,
adc_init(ADC_CHANNEL_15,AD_SINGLE); //初始化ADC通道15
adc_init(ADC_CHANNEL_TEMPSENSOR,AD_SINGLE); //初始化ADC通道:内部温度
emuart_init(UART_User,115200);
//(1.6)使能模块中断
uart_enable_re_int(UART_User);
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
printf("------------------------------------------------------\n");
printf("金葫芦提示: \n");
printf("(1)目的:ADC单端输入与差分输入测试 \n");
printf("(2)单端:内部温度传感器,通道号17,无需引脚对应 \n");
printf(" 差分:GEC引脚47、46(通道1、2) \n");
printf(" GEC引脚12、11(通道15、16 \n");
printf("(3)测试方法:单端:手摸芯片表面,A/D值增大,不要摸 \n");
printf(" 到引脚,静电可能损坏芯片 \n");
printf(" 差分:将引脚47接地、46接3.3V,观察通道1情况\n");
printf(" 将引脚46接地、47接3.3V,观察通道1情况\n");
printf(" 类似方法,观察通道15 \n");
printf("------------------------------------------------------\n");
//(1)======启动部分(结尾)==========================================
//(2)======主循环部分(开头)========================================
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数变量+1
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
//延时1秒
if (mMainLoopCount<=3000000) continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量
mMainLoopCount=0;
//(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
if (mFlag=='L') //判断灯的状态标志
{
mLightCount++;
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //灯“亮”
Delay_ms(1000);
}
//(2.3.3)如灯状态标志mFlag为'A',改变灯状态及标志
else
{
mFlag='L'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //灯“暗”
Delay_ms(1000);
}
num_AD1 = adc_ave(ADC_CHANNEL_1,8); //读取ADC值,并进行滤波处理
num_AD2 = adc_ave(ADC_CHANNEL_15,8);
num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);
num_AD1_filtered = median_filter(num_AD1,num_AD1_last,8); //中值滤波
num_AD2_filtered = median_filter(num_AD2,num_AD2_last,8);
num_AD3_filtered = median_filter(num_AD3,num_AD3_last,8);
num_AD1_diff = diff_filter(num_AD1_filtered,num_AD1_last,8); //差值滤波
num_AD2_diff = diff_filter(num_AD2_filtered,num_AD2_last,8);
num_AD3_diff = diff_filter(num_AD3_filtered,num_AD3_last,8);
num_AD1_last = num_AD1_filtered; //更新上一次的ADC值
num_AD2_last = num_AD2_filtered;
num_AD3_last = num_AD3_filtered;
printf("通道1(GEC47、46)的A/D值: %d,滤波后差分值:%d\r\n",num_AD1_filtered,num_AD1_diff);
printf("通道15(GEC12、11)的A/D值:%d,滤波后差分值:%d\r\n",num_AD2_filtered,num_AD2_diff);
printf("内部温度传感器的A/D值:%d,滤波后差分值:%d\r\n\n",num_AD3_filtered,num_AD3_diff);
mCount++;
}
原文地址: https://www.cveoy.top/t/topic/fi2k 著作权归作者所有。请勿转载和采集!