完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
|
|
|
|
extern void Delay(vu32 nCount);
#define NUM_OF_RESULTS 8 // Number of temp sensor samples to take #define ADC_CHANNEL 0 // ADC channel for conversion #define SCALE_FACTOR 3 // For averaging converted samples #define ADC12_RATIO 0.805664 // 3300/4096(3300mV ref & 12bit converter, straight binary o/p) #define ADC_INPUT0 0 #define ADC_INPUT1 1 #define ADC_INPUT2 2 #define ADC_INPUT3 3 #define ADC_INPUT4 4 #define ADC_INPUT5 5 #define ADC_INPUT6 6 #define ADC_INPUT7 7 volatile unsigned char bdata; unsigned char ADC_Input = 0x00; unsigned char ADC_Cnt = 0x00; unsigned short ADC_Data = 0x0000; unsigned char ADC_Numbytes = 0x00; unsigned char i ; void TI_ADC128S022_Init(void) { ADC_Numbytes = 16; ADC_Data = 0; AD_CS_DISABLE(); AD_SCLK_DISABLE(); Delay(1000); AD_CS_ENABLE(); #if 0 switch(NUM_OF_RESULTS) { case 0:ADC_Input = ADC_INPUT0; break; case 1:ADC_Input = ADC_INPUT1; break; case 2:ADC_Input = ADC_INPUT2; break; case 3:ADC_Input = ADC_INPUT3; break; case 4:ADC_Input = ADC_INPUT4; break; case 5:ADC_Input = ADC_INPUT5; break; case 6:ADC_Input = ADC_INPUT6; break; case 7:ADC_Input = ADC_INPUT7; break; default: break; } #endif ADC_Input = 0xe1; for(ADC_Cnt = 0; ADC_Cnt < ADC_Numbytes; ADC_Cnt++) { Delay(1000); AD_SCLK_DISABLE(); if (ADC_Cnt<5) { if(ADC_Input&0x80) { ADC_DOU_ENABLE(); } else { ADC_DOU_DISABLE(); } ADC_Input <<= 1; } else { ADC_DOU_DISABLE(); } Delay(1000); AD_SCLK_ENABLE(); Delay(1000); // if(ADC_Cnt >= 4 ) // { // ADC_Data <<= 1; //if(ADC_DIN_ENABLE) // { // ADC_Data |= 0x0001; // } // else // { // ADC_Data &= 0xfffe; // } } // else // {;} //} AD_CS_DISABLE(); //AD_SCLK_ENABLE(); // *adc_data = ADC_Data; // return; // printf("%d ",ADC_Data); //这儿打印出来的值是4095 } void TI_ADC128S022_ADC_vout (void) { uint8_t i; static uint16_t results[NUM_OF_RESULTS]; // To store ADC output static uint32_t sum_adc_data = 0; // accumulate and avg adc results volatile static float vout; // ADC vout for(i=0; i<8;i++) { results = SPI_ReadWriteByte(ADC_CHANNEL); // read and store ADC Channel output sum_adc_data += results; // accumulate result Delay(1000); // acquisition time } sum_adc_data >>= SCALE_FACTOR; // Average the accumulated sum vout = sum_adc_data * ADC12_RATIO; // ADC vout sum_adc_data = 0; // Set Breakpoint here & see measured vout while(1) { printf("%f ",vout); //这儿打印值是205.444321 Delay(5000000); } } int main(void) { Init_Usart(); SPI_Configuration(); TI_ADC128S022_Init(); TI_ADC128S022_ADC_vout(); } 问题出在哪了,这是我的程序 |
|
|
|
你的程序是什么问题?
|
|
|
|
SPI配置,我用的64分频
|
|
|
|
你去看下clk一个周期多少时间,算一下就可以知道分多少频的。
|
|
|
|
|
|
|
|
|
|
|
|
这样看起来误差好像是有点大,但是也有几次数据是误差不大的,第一个就是多次采样,取平均,第二就是,那个模拟电压用RC滤波一下。
|
|
|
|
程序修改后的测试: 实际电压mv 误差mv 测量mv 4167 200.004639 3966.995361mv 3917 214.470947 3702.529053mv 3679 240.937256 3438.062744mv 3415 241.403564 3173.596436mv 3141 231.870117 2909.129883mv 2881 236.336426 2644.663574mv 2620 239.802734 2380.197266mv 2352 236.269043 2115.730957mv 2084.4 233.135474 1851.264526mv 1836 249.201782 1586.798218mv 1576.8 254.468213 1322.331787mv 这是我采集的误差,怎么减小误差
|
|
|
|
是不是你计算的公式有问题?
|
|
|
|
只有小组成员才能发言,加入小组>>
800 浏览 0 评论
1156 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2714 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1089浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
456浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 22:26 , Processed in 1.267235 second(s), Total 101, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号