2019 8 9 STM32F407ADS1526连续转换模式相关配置(采样率达到15000SPS)
没有试30000sps
采样率低可能还不能用,需要改变SPI速率等
使用ADS1256DRDY引脚作中断触发进行数据采集
main.c中(死循环前只执行一次):
1 if (state) 2 { 3 ADS1256WREG(ADS1256_MUX,(0 << 4) | ADS1256_MUXN_AINCOM); //ÉèÖÃͨµÀ 4 5 GPIO_ResetBits(GPIOB, GPIO_Pin_6);; 6 while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); //µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷ 7 // ADS1256WREG(ADS1256_MUX,channel); //ÉèÖÃͨµÀ 8 SPI_WriteByte(ADS1256_CMD_SYNC); 9 // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); 10 SPI_WriteByte(ADS1256_CMD_WAKEUP); 11 while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); 12 SPI_WriteByte(ADS1256_CMD_RDATAC); 13 while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); 14 TIM_Cmd(TIM4, ENABLE); //ʹÄÜTIMxÍâÉè 15 delay_us(8); 16 state = 0; 17 }
外部中断:
u8 state=1;long double getval[15010]; static u32 i; //ÍⲿÖжÏ0·þÎñ³ÌÐò void EXTI9_5_IRQHandler(void) {long ulResult;long double ldVolutage;if(EXTI_GetITStatus(EXTI_Line8)!=RESET) {// ADS1256WREG(ADS1256_MUX,(0 << 4) | ADS1256_MUXN_AINCOM); //ÉèÖÃͨµÀ // // GPIO_ResetBits(GPIOB, GPIO_Pin_6);; // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); //µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷ // // ADS1256WREG(ADS1256_MUX,channel); //ÉèÖÃͨµÀ // SPI_WriteByte(ADS1256_CMD_SYNC); // // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); // SPI_WriteByte(ADS1256_CMD_WAKEUP); // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); // SPI_WriteByte(ADS1256_CMD_RDATA); // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)); // delay_us(8); // if(i<15000){ulResult |= (SPI_WriteByte(0xff) << 16);ulResult |= (SPI_WriteByte(0xff) << 8);ulResult |= SPI_WriteByte(0xff);state = 1;if( ulResult & 0x800000 ){ulResult = ~(unsigned long)ulResult;ulResult &= 0x7fffff;ulResult += 1;ulResult = -ulResult;}getval[i++] = (long double)ulResult*5/8388607; // i++; // printf("i = %d\r\n",i); // printf("%lf",ldVolutage); //double // printf("V\r\n"); }else { // for(int t = 0;t<i;t++) // { // printf("t = %d\r\n",t); // printf("%lf",getval[t]); //double // printf("V\r\n"); // }i=0;}} EXTI_ClearITPendingBit(EXTI_Line8); //Çå³ýLINE0ÉϵÄÖжϱê־λ } //ÍⲿÖжϳõʼ»¯³ÌÐò //³õʼ»¯PE2~4,PA0ΪÖжÏÊäÈë. void EXTIX_Init(void) {NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;// KEY_Init(); //°´¼ü¶ÔÓ¦µÄIO¿Ú³õʼ»¯ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//ʹÄÜSYSCFGʱÖÓ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource8);//PB8 Á¬½Óµ½ÖжÏÏß8/* ÅäÖÃEXTI_Line2,3,4 */EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//ÖжÏʼþEXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;//ÖжÏÏßʹÄÜEXTI_Init(&EXTI_InitStructure);//ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//ÍⲿÖжÏ0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//×ÓÓÅÏȼ¶2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀNVIC_Init(&NVIC_InitStructure);//ÅäÖà }
ADS1256配置
void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOBʱÖÓRCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//ʹÄÜSPI1ʱÖÓ//GPIOFB3,4,5³õʼ»¯ÉèÖÃGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5¸´Óù¦ÄÜÊä³ö GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³öGPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀGPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯ GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3¸´ÓÃΪ SPI1GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4¸´ÓÃΪ SPI1GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5¸´ÓÃΪ SPI1//ÕâÀïÖ»Õë¶ÔSPI¿Ú³õʼ»¯RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//¸´Î»SPI1RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//Í£Ö¹¸´Î»SPI1 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«ÏòÈ«Ë«¹¤SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //´®ÐÐͬ²½Ê±ÖӵĿÕÏÐ״̬ΪµÍµçƽSPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //´®ÐÐͬ²½Ê±Öӵĵڶþ¸öÌø±äÑØ£¨ÉÏÉý»òϽµ£©Êý¾Ý±»²ÉÑùSPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆSPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //¶¨Ò岨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼SPI_InitStructure.SPI_CRCPolynomial = 7; //CRCÖµ¼ÆËãµÄ¶àÏîʽSPI_Init(SPI1, &SPI_InitStructure); //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷ SPI_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè }//³õʼ»¯ADS1256 GPIO void Init_ADS1256_GPIO(void) {GPIO_InitTypeDef GPIO_InitStructure; RCC -> AHB1ENR |= (1<<1); //PB GPIO_InitStructure.GPIO_Pin = GPIO_RCC_ADS1256Reset|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_RCC_ADS1256Reset_PORT, &GPIO_InitStructure); GPIO_ResetBits(GPIO_RCC_ADS1256Reset_PORT, GPIO_RCC_ADS1256Reset );GPIO_InitStructure.GPIO_Pin = GPIO_ADS1256DRDY; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIO_ADS1256DRDY_PORT, &GPIO_InitStructure); SPI1_Init(); }//-----------------------------------------------------------------// // ¹¦ ÄÜ£º Ä£ÄâSPIͨÐÅ // Èë¿Ú²ÎÊý: / ·¢Ë͵ÄSPIÊý¾Ý // ³ö¿Ú²ÎÊý: / ½ÓÊÕµÄSPIÊý¾Ý // È«¾Ö±äÁ¿: / // ±¸ ×¢: ·¢ËͽÓÊÕº¯Êý //-----------------------------------------------------------------// unsigned char SPI_WriteByte(unsigned char TxData) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//µÈ´ý·¢ËÍÇø¿Õ SPI_I2S_SendData(SPI1, TxData); //ͨ¹ýÍâÉèSPIx·¢ËÍÒ»¸öbyte Êý¾Ýwhile (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //µÈ´ý½ÓÊÕÍêÒ»¸öbyte return SPI_I2S_ReceiveData(SPI1); //·µ»Øͨ¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý } //-----------------------------------------------------------------// // ¹¦ ÄÜ£ºADS1256 дÊý¾Ý // Èë¿Ú²ÎÊý: / // ³ö¿Ú²ÎÊý: / // È«¾Ö±äÁ¿: / // ±¸ ×¢: ÏòADS1256ÖеØַΪregaddrµÄ¼Ä´æÆ÷дÈëÒ»¸ö×Ö½Údatabyte //-----------------------------------------------------------------// void ADS1256WREG(unsigned char regaddr,unsigned char databyte) {GPIO_ResetBits(GPIOB, GPIO_Pin_6);while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));//µ±ADS1256_DRDYΪµÍʱ²ÅÄÜд¼Ä´æÆ÷//Ïò¼Ä´æÆ÷дÈëÊý¾ÝµØÖ·SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));//дÈëÊý¾ÝµÄ¸öÊýn-1SPI_WriteByte(0x00);//ÏòregaddrµØÖ·Ö¸ÏòµÄ¼Ä´æÆ÷дÈëÊý¾Ýdatabyte SPI_WriteByte(databyte);delay_us(1);GPIO_SetBits(GPIOB, GPIO_Pin_6); }//³õʼ»¯ADS1256 void ADS1256_Init(void) {Init_ADS1256_GPIO();GPIO_ResetBits(GPIOB, GPIO_Pin_7); delay_us(50);GPIO_SetBits(GPIOB, GPIO_Pin_7);//RESETdelay_us(50); GPIO_ResetBits(GPIOB, GPIO_Pin_6);//CSADS1256WREG(ADS1256_STATUS,0x06); // ¸ßλÔÚÇ°¡¢Ð£×¼¡¢Ê¹Óûº³åwhile(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));SPI_WriteByte(ADS1256_CMD_SELFCAL);//Æ«ÒÆÔöÒæ×ÔУ׼ // ADS1256WREG(ADS1256_MUX,0x08); // ³õʼ»¯¶Ë¿ÚA0Ϊ¡®+¡¯£¬AINCOMλ¡®-¡¯ // while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));ADS1256WREG(ADS1256_ADCON,0); // ·Å´ó±¶Êý1ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_15000SPS); // Êý¾Ý5spsADS1256WREG(ADS1256_IO,0x00); GPIO_SetBits(GPIOB, GPIO_Pin_6); }
转载于:https://www.cnblogs.com/calm-monkey/p/11369858.html
2019 8 9 STM32F407ADS1526连续转换模式相关配置(采样率达到15000SPS)相关推荐
- Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理
2019独角兽企业重金招聘Python工程师标准>>> Nginx防盗链 Nginx防盗链配置需要与不记录日志和过期时间结合在一起,因为都用到了location. 打开配置文件,注释 ...
- LNMP架构php-fpm相关配置
2019独角兽企业重金招聘Python工程师标准>>> 11月30日任务 12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_based ...
- 限制php解析、user_agent、php相关配置
2019独角兽企业重金招聘Python工程师标准>>> 11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php ...
- Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理
2019独角兽企业重金招聘Python工程师标准>>> Nginx防盗链 在配置文件里写入以下内容: 用curl测试 访问控制 Nginx限制某些IP不能访问或者只允许某些IP访问. ...
- 禁止解析PHP、限制user_agent、php相关配置
2019独角兽企业重金招聘Python工程师标准>>> 11.28 限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.12 ...
- (八)限定某个目录禁止解析php、限制user_agent和PHP相关配置
2019独角兽企业重金招聘Python工程师标准>>> 限定某个目录禁止解析php 对于使用php语言编写的网站,有一些目录是有需求上传文件的.如果网站代码有漏洞,让黑客上传了一个用 ...
- LAMP架构(八)限定某个目录禁止解析、 限制user_agent、php相关配置
2019独角兽企业重金招聘Python工程师标准>>> 访问控制-限制某个目录禁止php解析 一般用于存储静态文件的目录,因为图片等之类的文件是不需要解析PHP的,且静态文件目录也不 ...
- Android学习之登陆界面设计(一)前后期准备以及相关配置
Android学习之登陆界面设计(一)前后期准备以及相关配置 前言 成品 成品样式 成品特点 工具 系统配置 手机配置 Android Studio 3.6.3 SDK 图片来源 矢量图标库 Back ...
- nginx的全局配置和HTTP相关配置
目录 资源类型: 网站访问量 网站访问量统计的重要指标 HTTP1.0和1.1的问题 HTTP2协议 HTTP 请求访问的完整过程 HTTP 请求报文 http协议状态码分类 http协议常用的!!状 ...
- HAL ADC连续转换模式 Continuous Conversion Mode
在学习Continuous Conversion Mode时,根据网上的例程和配置,我发现Continuous Conversion Mode ENABLE 和DISABLE输出结果好像没有区别.后来 ...
最新文章
- unused import statement
- c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分
- tls1.1 tls1.2_Java 8将默认使用传输级别安全性(TLS)1.2
- spring基于注释的配置_基于注释的Spring MVC Web应用程序入门
- warning C4828问题的处理
- IDEA创建.properties文件
- Zookeeper权限控制ACL详解
- zoj 3211 - Dream City
- javascrip 的数据类型
- [CC-CHEFINV]Chef and Swaps
- XILINX FPGA数字信号处理——2、数字信号处理实现方法
- 好课推荐|云安全领域的新宠CCSK
- 中国矿业大学计算机学院进复试,拟录取名单陆续公布!初试第二败北,倒数第一逆袭!...
- 设置word页面为绿色
- TensorFlow Objection Detection API使用教程
- 怎么翻译图片上的英文?图片翻译英文方法分享。
- Win10 功能大全
- mysql里面除号写法_Mysql之常见函数
- 记一次idea莫名其妙报错找不到依赖问题
- 自定义实现webpack插件原理解析
热门文章
- EPON+EOC 大批量设备网管解决方案
- 用Python发送微信消息给好友
- 新加坡读计算机专业,【去新加坡读计算机专业】 - 环外新加坡留学网
- PIXEL-LEVEL SELF-PACED LEARNING FOR SUPER-RESOLUTION
- shell中用grep查找并且不输出_grep无法查找shell传过来的变量?先注意一下文本格式吧!...
- 关于类unix系统(linux,bsd等)克隆的资料-2
- 帝国cms tag生成html,帝国CMS TAG标签伪静态化
- mac系统通过ADB与scrcpy实现手机投屏
- pale moon 最新版中文包安装方法
- android实现记事本app