OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8710|回复: 2

菜鸟求助!!!ADC注入组问题...求助大家,求助原子哥

[复制链接]

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
发表于 2013-8-21 11:16:47 | 显示全部楼层 |阅读模式
        

想着把原子哥的ADC获取外部电压和测试内部温度简单的结合到一块,但是遇到了俩问题
1:当红色背景语句不注释掉时,函数只能运行到main函数的while(1)之后就不在往下运行
2:当注释掉红色背景语句时,函数正常运行,但是得到电压的值是0,而且内部温度得到的值也不准确
                    


//主函数

int main(void)
{
u16 data;
float temp;
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
adc_init();
POINT_COLOR=RED; //字体颜色为红色
LCD_ShowString(30,50,"Mis Duan ^_^");
LCD_ShowString(30,70,"HE NAN Colleage");
LCD_ShowString(30,90,"@Mi Zhang");
LCD_ShowString(30,110,"2013/08/17");
LCD_ShowString(30,130,"ADC_CH12_VAL:");
LCD_ShowString(30,150,"ADC_CH12_VOL:0.000V");
LCD_ShowString(30,170,"ADC_TEMPER:00.000");
while(1)
{
POINT_COLOR=BLUE;
data=adc_getvalue();
LCD_ShowNum(134,130,data,4,16);
temp=(float)data*(3.3/4096);
data=temp;
LCD_ShowNum(134,150,data,1,16);
temp-=data;
temp*=1000;
LCD_ShowNum(150,150,temp,3,16);

temp=tempr_getvalue();
data=temp;
LCD_ShowNum(118,170,data,2,16);
temp=temp-data;
temp*=1000;
LCD_ShowNum(142,170,temp,3,16);
LED1=!LED1;
delay_ms(250);
}

}

//adc初始化函数
void adc_init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;

ADC_Init(ADC1,&ADC_InitStructure);
ADC_InjectedSequencerLengthConfig(ADC1,2);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_12,1,ADC_SampleTime_1Cycles5);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_16,2,ADC_SampleTime_41Cycles5);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1,ENABLE);

 ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

}
//获取外部电压函数
u16 adc_getvalue(void)
{
u16 datavalue;
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
datavalue=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
return datavalue;
}
//获取内部温度函数
float temper_getvalue(void)
{
u16 datavalue;
float v25=1.43;
float avg=0.0043;
float value,temper;
ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC));
datavalue=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
value=datavalue*(3.3/4096);
temper=(v25-value)/avg+25;
return temper;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-21 15:07:47 | 显示全部楼层
我们用的是规则组,你怎么用注入组去了?
注入组一般用于规则组转换时,打断规则组转换而进行的ADC转换。
单独用注入组,不知道可行不啊,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2013-8-4
在线时间
0 小时
 楼主| 发表于 2013-8-21 15:49:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
想着注入组有四个数据寄存器,方便,就改用了注入组,结果貌似弄不成功....谢了原子哥...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 17:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表