-
最新实验发现,程序是跳入了hardfaultexception中。可能是数组定义的问题,我数组容量是150,UINT16.
还是不能解释这个现象啊!大家积极帮忙啊,跪谢!
-
好吧,上代码。谢谢各位了!此处仅上ADC配置和中断服务程序!详细程序在附件中!void ConfigAdMode(void)
{
ADC_InitTypeDef
my_ADC_InitStructure;
ADC_DeInit(ADC1);
ADC_StructInit(&my_ADC_InitStructure);
my_ADC_InitStructure.ADC_Mode
= ADC_Mode_Independent; //独立模式
my_ADC_InitStructure.ADC_ScanConvMode
= DISABLE; //debug yuanlai使能
my_ADC_InitStructure.ADC_ContinuousConvMode
= DISABLE; //debug yuanlai失能
my_ADC_InitStructure.ADC_ExternalTrigConv
=ADC_ExternalTrigConv_T1_CC1;
my_ADC_InitStructure.ADC_DataAlign
= ADC_DataAlign_Right;
my_ADC_InitStructure.ADC_NbrOfChannel
= AC_CLASS_NUM;
ADC_Init(ADC1,
&my_ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,
ADC_Channel_4, AC_CLASS_ACV+1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1,
ADC_Channel_5, AC_CLASS_ACI+1, ADC_SampleTime_1Cycles5);
}
void
ADC1_2_IRQHandler(void)
{if(ADC_GetITStatus(ADC1,ADC_FLAG_EOC)==
SET)
ADC_ClearITPendingBit(ADC1,ADC_FLAG_EOC); {
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
g8_Sysadc%=150;
gm_SampleTempData.ACdata1[g8_Sysadc][0]=ADC_GetConversionValue(ADC1);
}
g8_Sysadc++;
}
-
正弦表有的 但不知道这里也要用.80105785 魏 欢迎沟通 谢谢!
-
我找了一个试了一下。但就是不知道频率和幅值怎么设置的
-
自己给自己顶一个吧,希望大家积极回帖!
我把问题详细一点吧。上例中,我DMA_BufferSize的值设置成300.但是只传输了60左右组数据之后,DMA_BufferSize的值就变0了,也就是说传输完成了,事实上还有80多组数据没有从AC-DR中传输到内存,然后就进入了传输完成中断。
-
好吧,我再详细一点吧。对50HZ交流电压采样,ADC转化由TIM1的CC1触发。触发频率为7.5KHZ.也就是说我再一个交流电压信号的周期内可以采样150个点。 但是我运行程序的时候发现就只采了16个点,这些数据中有fff,然后有70个左右的点数据为0(应该就是没采到吧).之后又有十多个点有数据。。。目前情况就是这么的 请用过ADC采样交流信号的朋友们帮帮忙。不胜感激!
-
转换的结果是存到gm_SampleTempData.ACdata[2][150]里面的,ACdata[0]是交流电压,ACdata[1]是交流电流,ACdata[0]的150个元素中有000和FFF。我不知道这是ADC的问题还是数学统计里面的问题 而且,我只做了交流电压采样,有的交流电流还有数据,不能理解!还请大家指导!谢谢!
[ 本帖最后由 迷雾重重 于 2011-12-9 13:30 编辑 ]
-
好吧,我把配置贴出来吧!
/* ADC1 registers reset ----------------------------------------------------*/
ADC_DeInit(ADC1);
/* ADC1 configuration ------------------------------------------------------*/
ADC_StructInit(&my_ADC_InitStructure);
my_ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
my_ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
my_ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
my_ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3; my_ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
my_ADC_InitStructure.ADC_NbrOfChannel = AC_CLASS_NUM;
ADC_Init(ADC1, &my_ADC_InitStructure);
// CLKad = 12MHz Tconv = 7.5 + 12.5 = 20周期 f_conv = 12MHz / 20 = 600K
ADC_InjectedChannelConfig(ADC1, ADC_Channel_4, AC_CLASS_ACV+1, ADC_SampleTime_7Cycles5); // AD_ACV
ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, AC_CLASS_ACI+1, ADC_SampleTime_7Cycles5); // AD_ACI
DMA_DeInit(DMA1_Channel1);
my_DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
my_DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&gm_SampleTempData.ACdata[0][0];
my_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
my_DMA_InitStructure.DMA_BufferSize = AC_SAMPLE_COUNT_NUM * AC_CLASS_NUM;
my_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
my_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
my_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
my_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
my_DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
my_DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
my_DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &my_DMA_InitStructure);
// Enable DMA1 channel1
DMA_Cmd(DMA1_Channel1, ENABLE);
TIM_OCStructInit(&my_TIM1_OCInitStructure);
// PWM 模式2
// 在向上计数时,一旦TIM1_CNTTIM1_CCR1 时通道3 为有效电平,否则为无效电平
my_TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// 输入/捕获 输出使能
my_TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// 输入/捕获 互补输出禁止
my_TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
// TIM1_CCRx
my_TIM1_OCInitStructure.TIM_Pulse = PWM1_PERIOD(gm_RCC_ClockFreq.PCLK2_Frequency) >> 1; // 占空比初始化为 50%
// OCx 高电平有效
my_TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// OCxN 低电平有效
my_TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
// 当MOE=0 时,如果实现了OCx/OCxN,则死区后OCxN/OCx=0
my_TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
my_TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC3Init(TIM1, &my_TIM1_OCInitStructure);
该配置下的试验结果如下:
我做1V电压的交流采样,并进行ADC变换。最低电压约为-1.414.我叠加了1.65的直流,现在最低电压就差不多0.235左右。最高电压约3.064左右。参考电压是3.3的,但是转换结果怎么会有0000和FFF
-
最中检查表明 我买到二手器件了。。。。一上电就复位。谢谢各位!
-
TIM_CtrlPWMOutputs(TIM1, ENABLE); 失能 试试呢?敢问楼主,TIM_OC1Init(TIM1, &TIM_OCInitStructure);这是通道1吧?ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC2;这是不是通道2?是不是矛盾的 ?我刚研究这块的 请指导 谢谢
-
你们用的是模拟IIC还是自带的?如果是模拟的话我很肯定的说,是时序的问题。重点就在程序中各处的延时。一个一个的试吧,调时序很麻烦的。我初学的,调了两个月才能读写数据。。。
-
自己给自己顶一个。
哥们,姐们,亲们顶起啊!
-
建议不要贴程序!
-
感谢回帖!
不过我觉得你不是看不明白我说的是什么,是不明白这个现象吧?我描述的也比较清晰了啊!
-
问题解决了,呵呵,是硬件的问题。板子上一个电感坏了。。。。以后大家调试时碰到问题千万不要网了检查硬件哦。
-
不好意思,我初学的,不太懂。侦测到FLASH 是怎么判断的?你能不能把具体的步骤和要求以及改进方案写出来?
-
终于成功的调通了,还是来做个总结吧。
正如楼上所说,是时序问题。确切的说是延时问题。我看别人延时是几十个指令周期,我开始也改了,但范围不大,就100以内改动。改了很久都不能通讯。后来我以冲动,就把时间搞到5000个指令周期,突然就能通讯了!然后再将延时优化,有的几十个收起就行了,有的延时要多点。我用最笨的方法,一个一个的试,最后终于得出了我认为的最优方案。
谢谢大家的支持!
-
谢谢啦!
-
楼上所指的时间长度是?麻烦把相关资料给我发一个行吗?我QQ是81015785 谢谢
我用的是STM32 铁电是FM31256。我目前所看到的关于I2C通信时序的资料只局限于STM32的参考手册。
-
首先,很感谢chunyang!!!已经是第三次帮我解答疑问了,虽然我还是没解决问题,但还是灰常的感激你啊!
是这样的 我检查起始信号,发现SDA SCL相继出现下降沿,没有缓冲,垂直下降的。手册上写的I2C时序有一个缓冲下降的过程,我不知道是不是这个影响正常通信的。停止条件也是垂直下降。
模拟I2C中,PB.9做的SDA脚。高电平时,SDA约为3.29V.在接受应答时,PB.9若设置成下拉输入模式,则本来应该是应答信号的低电平时刻,输出的仍为高电平信号,但电压约为2.9V。也就是说还是降了一点的,但是没降成低电平。
若将PB.9若设置成上拉输入模式或浮空输入,则在本来应该是应答的时候输出仍为3.29V.