完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前段时间一直没有抽出时间来学习和发帖,很是抱歉。隔了这么久再继续学习,却没有觉得太生疏,充分说明cypress BLE上手很容易啊! 直奔主题,今晚是将我学习使用片上ADC的过程分享出来。 具体的说,是参考了部分例程,使用ADC通道1采集片上的温度传感器的数据,然后将其分别转化为电压值和温度值发送到串口,通过电脑来接收。 =========================================================================== 1,新建一个工程。这里就不截图了; 2,在TopDesign里面添加相关组件,主要包括DieTemp,ADC,PWM,串口,时钟,以及一个IO; 3,DieTemp模块不用配置,下面是配置ADC的截图; 4,配置UART,主要是设置波特率。如下图: 5,紧接着是配置clock模块,如下图: 6,这里是配置PWM模块,这里我是将这里输出的PWM时钟来控制ADC的采样率,在这里添加一个IO口是想确认ADC的采样率是否正确。 7,最后是配置IO口。 配置完成后,关联引脚: UART的TX引脚关联到P1_5,IO就随便关联P1_4,方便测试。 然后编译通过,紧接着在main.c里面添加代码: #include #include /* ADC SAR sequencer component header to access Vref value */ #include #define CH0_N (0x00u) #define TEMP_CH (0x01u) #define DELAY_1SEC (100u) /* Get actual Vref. value from ADC SAR sequencer */ #define ADC_VREF_VALUE_V ((float)ADC_SAR_SEQ_DEFAULT_VREF_MV_VALUE/1000.0) volatile uint32 dataReady = 0u; volatile int16 result[ADC_SAR_SEQ_TOTAL_CHANNELS_NUM]; volatile uint32 timer_delay = 0u; /****************************************************************************** * Function Name: ADC_SAR_SEQ_ISR_LOC ******************************************************************************* * * Summary: * Handle Interrupt Service Routine. Source - ADC SAR Seq. * ******************************************************************************/ CY_ISR(ADC_SAR_SEQ_ISR_LOC) { uint32 intr_status; uint32 range_status; /* Read interrupt status registers */ intr_status = ADC_SAR_SEQ_SAR_INTR_MASKED_REG; /* Check for End of Scan interrupt */ if((intr_status & ADC_SAR_SEQ_EOS_MASK) != 0u) { /* Read range detect status */ range_status = ADC_SAR_SEQ_SAR_RANGE_INTR_MASKED_REG; /* Verify that the conversion result met the condition Low_Limit <= Result < High_Limit */ if((range_status & (uint32)(1ul << CH0_N)) != 0u) { /* Read conversion result */ result[CH0_N] = ADC_SAR_SEQ_GetResult16(CH0_N); } /* Clear range detect status */ ADC_SAR_SEQ_SAR_RANGE_INTR_REG = range_status; dataReady |= ADC_SAR_SEQ_EOS_MASK; } /* Clear handled interrupt */ ADC_SAR_SEQ_SAR_INTR_REG = intr_status; } /******************************************************************************* * Function Name: main ******************************************************************************** * * Summary: * * Parameters: * None. * * Return: * None. * *******************************************************************************/ int main() { int16 res = 0; int32 temperature; char uartLine[250]; int16 ADCCountsCorrected; /* Initialize the UART */ UART_Start(); UART_PutCRLF(); UART_PutCRLF(); UART_PutString("Starting temperature measurement..."); UART_PutCRLF(); PWM_Start(); PWM_TriggerCommand(PWM_MASK, PWM_CMD_START); /* Init and start sequencing SAR ADC */ ADC_SAR_SEQ_Start(); ADC_SAR_SEQ_StartConvert(); /* Enable interrupt and set interrupt handler to local routine */ ADC_SAR_SEQ_IRQ_StartEx(ADC_SAR_SEQ_ISR_LOC); CyGlobalIntEnable; for(;;) { /* When conversion of sequencing channels has completed */ if((dataReady & ADC_SAR_SEQ_EOS_MASK) != 0u) { /* Get voltage, measured by ADC */ dataReady &= ~ADC_SAR_SEQ_EOS_MASK; res = ADC_SAR_SEQ_CountsTo_mVolts(CH0_N, result[CH0_N]); /////////// /****************************************************************************** * Adjust data from ADC with respect to Vref value. * This adjustment is to be done if Vref is set to any other than * internal 1.024V. * For more detailed description see Functional Description section * of DieTemp P4 datasheet. *******************************************************************************/ ADCCountsCorrected = result[CH0_N]*((int16)((float)ADC_VREF_VALUE_V/1.024)); temperature = DieTemp_CountsTo_Celsius(ADCCountsCorrected); /* Print temperature value to UART */ sprintf( uartLine, "Temperature value: %dC", (int16) temperature ); UART_PutString(uartLine); UART_PutCRLF(); /* Print voltage value to UART */ sprintf( uartLine, "ADC measured voltage: %dmV", (uint16) res ); UART_PutString(uartLine); UART_PutCRLF(); ///////////copy from next } } } 再次编译,然后下载到板子上。让其运行起来。 首先测试一下,IO的输出。 结果如下图: 然后打开串口调试助手,查看接受数据: 说明一下:我在这里的大部分代码都是参考的cypress的例程,再他们的基础上按照我的需求修改的,不得不说cypress的配套服务蛮好的。 下一步,我准备把BLE模块添加进来,然后用手机来读数测试。后面再自己开个PCB板子,做成一个模块。
|
|
相关推荐
2 个讨论
|
|
只有小组成员才能发言,加入小组>>
754个成员聚集在这个小组
加入小组2102 浏览 1 评论
1848 浏览 1 评论
3666 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1783 浏览 6 评论
1533 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
566浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
420浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
435浏览 2评论
381浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
913浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:49 , Processed in 1.049672 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号