[活动专区] 【杰发科技AC7802x测评】OLED制作简易示波器

[复制链接]
 楼主| 将爱 发表于 2023-7-4 19:59 | 显示全部楼层 |阅读模式
本帖最后由 将爱 于 2023-7-9 16:16 编辑

不论是外壳还是板子都还挺精致的
e40268b6f976a3d6c65d0349b69200d.jpg
eff1911b4e2e724016ad6667c4507ef.jpg
我这里移植了一个之前做的简易示波器,仅展示了波形显示功能,主要用到ADC,看杰发的手册ADC介绍的很详细,以前用别的芯片都只是用单次扫描,或者循环扫描,其他方式也没怎么注意过,而且别家介绍的其他扫描方式总感觉是一带而过,文字介绍的干巴巴的,杰发这里配图挺详细,规则组扫描,注入组扫描是怎么互相配合的,通过配置多种扫描方式之后,只需要开始扫描等待结束标志就可以了,全硬件触发,常规的单次扫描都需要软件来切换通道控制,这种多样式工作模式带来了极大便利。具体还需要详看手册
注入组采样.jpg
规则组采样.jpg
规则组+注入组采样.jpg
这里我们只需要用到1个通道ADC,用规则组序列采样,通道数量设置1就行
  1. /*!
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] 初始化ADC,配置ADC参数。
  3. *
  4. * @param[in] none
  5. * [url=home.php?mod=space&uid=266161]@return[/url] none
  6. */
  7. void ADC_Sample_init(void)
  8. {
  9.     ADC_ConfigType adcConfig;                    /*! ADC初始化配置*/
  10.     ADC_AMOConfigType amoConfig;                 /*! ADC中断配置*/
  11.     memset(&adcConfig, 0x00, sizeof(adcConfig)); /*! 清空结构体*/
  12.     memset(&amoConfig, 0x00, sizeof(amoConfig)); /*! 清空结构体*/

  13.     /*! ADC输入端口(电位器)配置*/
  14.     GPIO_SetFunc(GPIOB, GPIO_PIN4, GPIO_FUN2); /*PB4外接ADC       PA10复用为FUN2,为ADC_IN1 ,对应电位器VR1   PB4-ADC_IN12*/

  15.     /*! ADC配置
  16.     ADC固定为12位分辨率,工作模式为MODE5(工作模式内容见参考手册8.4.2章节)规则组扫描+注入组扫描模式多通道连续转换,规则组长度为3。
  17.     单次触发连续转换,每次转换规则组中的3个通道。
  18.     */
  19.     adcConfig.clkPsc                     = ADC_CLK_PRESCALER_2;  /*! ADC时钟分频设置,Set ADC Clk = APB时钟频率/(clkPsc + 1) = 16M/2 = 8M */
  20.     adcConfig.scanModeEn                 = DISABLE;              /*! 模式配置SCAN:扫描模式使能位 多通道需使能扫描模式,单通道则不需要使能*/
  21.     adcConfig.continuousModeEn           = DISABLE;              /*! 模式配置CONT:连续模式使能位 0:触发一次后只转换一次,1:触发后可连续转换*/
  22.     adcConfig.regularDiscontinuousModeEn = DISABLE;              /*! 模式配置DISCEN:打开规则组间断转换模式*/
  23.     adcConfig.injectDiscontinuousModeEn  = DISABLE;              /*! 模式配置IDISEN:打开注入组间断转换模式*/
  24.     adcConfig.injectAutoModeEn           = DISABLE;              /*! 模式配置IAUTO:自动注入模式*/
  25.     adcConfig.intervalModeEn             = DISABLE;              /*! 模式配置INTERVAL:注入组为间隔转换模式*/
  26.     adcConfig.regularDiscontinuousNum    = 0;                    /*! 规则组子组长度,用于Mode7和Mode8*/
  27.     adcConfig.interruptEn                = ENABLE;               /*! 总中断使能*/
  28.     adcConfig.voltageRef                 = ADC_VOLTAGEREF_VDDA;  /*! ADC参考源选择 */
  29.     adcConfig.regularTriggerMode         = ADC_TRIGGER_INTERNAL; /*! 规则组触发源类型选择*/
  30.     adcConfig.injectTriggerMode          = ADC_TRIGGER_INTERNAL; /*! 注入组触发源类型选择*/
  31.     adcConfig.regularSequenceLength      = 0;                    /*! 规则组长度*/
  32.     adcConfig.injectSequenceLength       = 0;                    /*! 注入组长度*/
  33.     adcConfig.dataAlign                  = ADC_DATA_ALIGN_RIGHT; /*! 数据右对齐*/
  34.     adcConfig.callBack                   = ADC_Callback;         /*! ADC回调函数*/
  35.     adcConfig.powerMode                  = ADC_POWER_ON;         /*! ADC上电*/
  36.     ADC_Init(ADC0, &adcConfig);                                  /*! ADC works Mode Config*/

  37.     /*!
  38.         ADC转换率计算公式:
  39.         总转换时间=(SPT+ 12)/ADC时钟频率+5个APB时钟周期
  40.         备注:
  41.         1.SPT为采样周期个数,具体见下面ADC_SPT_CLK_x。
  42.         2.ADC时钟频率 = APB时钟频率 /(分频系数+1)
  43.         3.7802x ADC支持的最高采样率为250Ksps(即转换时间不低于4us),如果配置采样率高于该值,可能会导致采样结果精度显著减低。
  44.     */
  45.     /*! 规则组通道转换序列和转换速率配置*/
  46.     ADC_SetRegularGroupChannel(ADC0, ADC_CH_12, ADC_SPT_CLK_33, 0);   /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  47. //    ADC_SetRegularGroupChannel(ADC0, ADC_CH_1, ADC_SPT_CLK_33, 1);   /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  48. //    ADC_SetRegularGroupChannel(ADC0, ADC_CH_VIN, ADC_SPT_CLK_33, 2); /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
  49.     /*! Bandgap或T-sensor内部通道配置*/
  50. //    ADC_SetInternalChannel(ADC0, ADC_INTERNAL_TSENSOR); /*! 内部电压信号选择(仅在使用了ADC_CH_VIN 时配置) */
  51. //    ADC_SetVBufEnableFlag(ADC0, ENABLE);                /*! Bandgap和T-sensor内部通道使能(仅在使用了ADC_CH_VIN 时配置) */

  52.     /*! 模拟监控配置 */
  53. //    amoConfig.AMOTriggerMode   = ADC_AMO_TRIGGER_EDGE;  /*! 边沿触发模式,监控异常和恢复*/
  54. //    amoConfig.AMOInterruptEn   = ENABLE;                /*! AMO中断使能*/
  55. //    amoConfig.AMORegularEn     = ENABLE;                /*! 规则组通道监控使能*/
  56. //    amoConfig.AMOInjectEn      = DISABLE;               /*! 注入组通道监控去能*/
  57. //    amoConfig.AMOSingleModeEn  = ENABLE;                /*! 单通道使能*/
  58. //    amoConfig.AMOSingleChannel = ADC_CH_1;              /*! 监控通道配置*/
  59. //    amoConfig.AMOHighThreshold = AMO_HIGH_VALUE;        /*! 监控电压高阀值,大于该值会置位AMO标志(电平触发模式),或置位AAMO标志(边沿触发模式)。*/
  60. //    amoConfig.AMOLowThreshold  = AMO_LOW_VALUE;         /*! 监控电压低阀值,低于该值会置位AMO标志(电平触发模式),或置位NAMO标志(边沿触发模式)。*/
  61. //    amoConfig.AMOHighOffset    = AMO_HIGH_OFFSET_VALUE; /*! 高阀值电压恢复偏移值(仅边沿触发模式使用);恢复边界值= 高阀值-高偏移值,当电压低于高恢复边界值,会置位NAMO标志。*/
  62. //    amoConfig.AMOLowOffset     = AMO_LOW_OFFSET_VALUE;  /*! 低阀值电压恢复偏移值(仅边沿触发模式使用);恢复边界值= 低阀值+低偏移值,当电压高于低恢复边界值,会置位NAMO标志。*/
  63. //    ADC_SetAnalogMonitor(ADC0, &amoConfig);             /*! 配置寄存器*/

  64.     ADC_SoftwareStartRegularConvert(ADC0); /*! 软件触发规则组采样*/
  65. }

  66. uint16_t Get_Adc( uint8_t ch )
  67. {
  68.         ADC_SoftwareStartRegularConvert(ADC0); /*! 软件触发规则组采样*/
  69.         while (!ADC_GetEOCFlag(ADC0, 0)) /*! 等待规则组最后一个通道转换完成*/
  70.         {
  71.                 /* Wait */
  72.         }
  73.         return ADC_GetRegularData(ADC0, 0);
  74. }
复制代码
OLED驱动比较容易,都是之前做好的简单移植就好,附视频


d0b6a4b02bb6e661ea5777d61e9e8a2.jpg
badbbc3f58c9dd9e1a01e1d77fc36b6.jpg
3573b39ea4b76e09389a2a4730abf32.jpg


202307041937(1).gif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

62

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部