找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5308|回复: 7
打印 上一主题 下一主题
收起左侧

基于proteus的stm32的ADC采集电压并用串口显示问题

[复制链接]
跳转到指定楼层
楼主
我想用proteus仿真stm32的ADC功能(中断),但是之前解决的串口问题又来了,什么也不显示。之前还有一个问题是,显示的时候只显示整数,电压值是分数的统统不显示,百思不得其解,向各位大佬求助
单通道(中断读取).zip (402.67 KB, 下载次数: 104)

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "bsp_usart.h"
  3. #include "bsp_adc.h"
  4. #include "bsp_rccclkconfig.h"


  5. extern __IO uint16_t ADC_ConvertedValue;

  6. // 局部变量,用于保存转换计算后的电压值         
  7. float ADC_ConvertedValueLocal;        

  8. // 软件延时
  9. void Delay(__IO uint32_t nCount)
  10. {
  11.   for(; nCount != 0; nCount--);
  12. }

  13. /**
  14.   * @brief  主函数
  15.   * @param  无
  16.   * @retval 无
  17.   */
  18. int main(void)
  19. {        
  20.         //HSE_SetSysClk( RCC_PLLMul_9 );
  21.         HSI_SetSysClk( RCC_PLLMul_14 );
  22.         
  23.         MCO_GPIO_Config();
  24.         RCC_MCOConfig(RCC_MCO_SYSCLK);
  25.         // 配置串口
  26.         USART_Config();
  27.         
  28.         // ADC 初始化
  29.         ADCx_Init();
  30.         
  31.         printf("\r\n ----这是一个ADC单通道中断读取实验----\r\n");
  32.         
  33.         while (1)
  34.         {
  35.                 ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
  36.         
  37.                 printf("\r\n The current AD value = 0x%04X \r\n",
  38.                        ADC_ConvertedValue);
  39.                 printf("\r\n The current AD value = %f V \r\n",
  40.                        ADC_ConvertedValueLocal);
  41.                 printf("\r\n\r\n");

  42.                 Delay(10000);  
  43.         }
  44. }
  45. /*********************************************END OF FILE**********************/
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648760 发表于 2020-3-8 11:23 | 只看该作者
有人说,proteus仿真STM32时钟频率太高的话容易失败,我估计时钟频率的问题,我还从没使用过HSI,没细看你最后频率是多少。另外没看出你的程序中ADC_ConvertedValue的值怎么来的。
回复

使用道具 举报

无效楼层,该帖已经被删除
地板
ID:648760 发表于 2020-3-8 11:32 | 只看该作者
没见怎样得到转换值的,没函数,也没见调用。
回复

使用道具 举报

5#
ID:696129 发表于 2020-3-8 11:52 | 只看该作者
qinsir88 发表于 2020-3-8 11:23
有人说,proteus仿真STM32时钟频率太高的话容易失败,我估计时钟频率的问题,我还从没使用过HSI,没细看你 ...

protues里用HSE总是输出乱码,时钟频率,波特率一样也显示不出来,使用HSI再把时钟频率调到56MHz及以下就能正常运行了,也不知道为什么。电压采集是在中断里面
  1. void ADC_IRQHandler(void)
  2. {        
  3.         if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET)
  4.         {
  5.                 // 读取ADC的转换值
  6.                 ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
  7.         }
  8.         ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
  9. }
复制代码
以下是设置中断的函数
  1. static void ADC_NVIC_Config(void)
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStructure;
  4.         // 优先级分组
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  6.   // 配置中断优先级
  7.   NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
  8.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  9.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  10.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11.   NVIC_Init(&NVIC_InitStructure);
  12. }
复制代码




回复

使用道具 举报

6#
ID:648760 发表于 2020-3-8 23:10 | 只看该作者
我估计是proteus的支持问题,这方面例子很少,我弄过一个可以在原子开发板上跑的串口接收中断的例子挪到proteus上,串口接收中断不[看到运行,也不知道怎么回事。[你找个板子试试吧em06]
回复

使用道具 举报

7#
ID:760611 发表于 2020-5-25 13:19 | 只看该作者
楼主解决了吗,我的也是串口不显示采集数据,感觉应该是printf的问题,我的一加上printf 串口就不显示数据了
回复

使用道具 举报

8#
ID:512644 发表于 2020-7-28 10:35 | 只看该作者
无踪雪 发表于 2020-3-8 11:52
protues里用HSE总是输出乱码,时钟频率,波特率一样也显示不出来,使用HSI再把时钟频率调到56MHz及以下就 ...

仿真总是失败,总是缺少debug文件,该如何解决
回复

使用道具 举报

9#
ID:440028 发表于 2021-12-30 14:51 | 只看该作者
这个例程没有问题,你可以在51黑里下载一个例程做对比,这样才能找到问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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