你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

[复制链接]
北京小王儿 发布时间:2009-3-25 18:05
阅读主题, 点击返回1楼
收藏 评论38 发布时间:2009-3-25 18:05
38个回答
clonehe1225 回答时间:2010-10-20 16:48:35

RE:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

感谢LZ,学习啦
wuguoyan 回答时间:2010-11-25 18:45:09

回复:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

<div style="border-bottom: #ccc 1px dashed; border-left: #ccc 1px dashed; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; border-top: #ccc 1px dashed; border-right: #ccc 1px dashed; padding-top: 5px">回复第 1 楼 北京小王儿于2009-03-25 10:05:13发表:
今天是3月9号,再过3个月就要大学毕业了,最近工作找得郁闷。干脆躲回实验室,总结下我的毕业设计,算是把自己的大学画个句号吧。

1 概述
毕业设计的题目是“基于STM32的简易示波器设备驱动的研究”,就是利用STM32的AD采集波形数据,然后通过它内置的USB2.0把数据传到PC上面显示出来。框图如下。


题目一共是两个人做,我和我搭档耗子。他做信号处理,采集部分。我做USB在PC下的驱动开发,以及上位机界面的显示。USB固件那部分我们是一起完成的。
  这个课题从08年10月开始,到12月圣诞前夕基本完成。最后基本实现了波形的显示,实测最大可以测量的频率是200KHZ,
效果图如下:




<font color="#000000">方波的图形好像不是很漂亮会有上升沿老是有尖刺,还需要作软件做处理。没截出来,

  最后能出数据离不开很多前辈的经验。有些地方是借鉴了他们的东西。现在先列出来。
第一个是21IC上面alien2006原帖地址。他也是做了一个简易示波器,但是用的是以太网传输。采集部分我很多借鉴了他的方案。
第二个是电脑圈圈,他对USB的理解令我钦佩。我能搞出驱动,他提供的源码包非常重要,有些代码也是直接在他的基础上修改的。

2 整体方案
  先说下一次完整的采集,比如外面进来的波形是正弦波,波形电压有正负,STM32单片机的AD只能采集0~3.6V的电压,所以要对信号进行 处理。也就是需要一个模拟前端电路,把电压抬上去。接着就是采集了,STM32的AD可以用外设进行触发,这里用定时器进行触发。每过一个单位时间AD开 启一次,采集一个点,这样采集的频率只要调整这个单位时间也就是定时器就可以控制了。采集了一桢数据,比如200个点。DMA中断被触发,开启USB,把 数据发送到上位机,然后显示出来。
  整个过程大体就是这样了,还有一个很重要的环节补充下。熟悉示波器的人都知道示波器有个触发概念。像刚才这样显示的话,比如前一帧数据是波 峰开始显示,后一帧是波谷开始。这样显示出来的波形就是乱的,于是为了解决这个问题,就需要做触发,也就是保证每次采集的起始电位相同。我们的采用的是用 外中断的形式,外面波形数据先不采集,先让它通过一个比较器,比如比较器的基准电压是1V,也就是每次都和1V比较,低于1V输出低电平,高于1V输出高 电平。当数据电压大于1V的时候,比较器输出高电平,高电平接到单片机外中断口,这样外中断就被触发。然后开始采集,这样就能保证每帧数据的起始点都相 同。
  这个方案是大体方案,后来做了下修改。就是让AD一直在采集。外中断触发了后开启的是DMA,AD一直开着,只是控制DMA什么时候去取。从哪里开始取,取多少个点。下位机部分不再详说,贴下主要的程序,大侠们随便看看,多多指教。
定时器设置代码如下:
/*******************************************************************************
* Function Name  : TIM_Configuration
* Description    : Configure the TIM2.
*******************************************************************************/
void TIM2_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  
  TIM_DeInit(TIM2); //TIM2初始化
    
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 18; //设置了下一个更新事件装入活动的自动重装载寄存器周期的值
  TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置了用来作为TIMx时钟频率除数的预分频值
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置了时钟分割
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //选择了计数器模式向上计数

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx

  /* Prescaler configuration */
//  TIM_PrescalerConfig(TIM2, 1, TIM_PSCReloadMode_Update); //设置TIMx重载次数 预分频值在更新事件装入
 
  /* TIM_OCMode_Toggle Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;          
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;          
  TIM_OCInitStructure.TIM_Pulse = 9;  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //TIM输出比较极性低
    
  TIM_OCInit(TIM2, &TIM_OCInitStructure);
  
  TIM_ARRPreloadConfig(TIM2, ENABLE); //使能或者失能TIMx在ARR上的自动装载寄存器
  
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE); //使能TIMx外设
}
AD以及DMA设置代码:
/*******************************************************************************
* Function Name  : ADC_Configuration
* Description    : Configure the ADC1.
*******************************************************************************/
void ADC_Configuration(void)
{
  /* DMA channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA_Channel1); //复位DMA_Channel1
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //外围设备地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Data[0]; //memory 地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外围设备做为源
  DMA_InitStructure.DMA_BufferSize = 1024;  //数据单元尺寸
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外围地址是否自动增长 disable不增长
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //memory 是否自动增长
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外围设备寄存器尺寸16位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //memory尺寸16位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //DMA 循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //DMA 通道优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //memory- to-memory转换
  DMA_Init(DMA_Channel1, &DMA_InitStructure);  //初始化DMA通道1

  /* DMA IT enable */
  DMA_ITConfig(DMA_Channel1, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
 
  /* ADC1 configuration ------------------------------------------------------*/                                                     
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC 工作模式 ADC1 ADC2 单独工作    
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //多通道扫描模式
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //是否启用连续转换模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;  //触发方式
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 1;  //ADC规则转换通道数量
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel10 configuration */ //配置转换规则
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);
  
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */
  ADC_ResetCalibration(ADC1);  //复位ADC1 校准
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位完成

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);  //开始ADC1 校准转换
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));  //等待转换完成
  
  ADC_ExternalTrigConvCmd( ADC1, ENABLE); //使能或者失能ADCx的经外部触发启动转换功能
}

DMA中断服务程序:
/*******************************************************************************
* Function Name  : DMAChannel1_IRQHandler
* Description    : This function handles DMA Stream 1 interrupt request.
*******************************************************************************/
void DMAChannel1_IRQHandler(void)
{
  DMA_Cmd(DMA_Channel1, DISABLE);  //关闭DMA通道1
  for(count=64;count
zzfd97 回答时间:2010-11-25 20:47:40

RE:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

   xiexie
gx19890101-1455 回答时间:2010-12-16 20:21:11

回复:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

 那么那么你们你们
xiaorui2028 回答时间:2011-5-25 15:20:48

RE:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

楼主你好,我现在在做这个毕业设计,很急,能否指点下,可以加我的qq不(610878851)或者发些资料到我邮箱(xiaorui2028@sina.com)
allenzhuo 回答时间:2012-6-18 17:07:03

回复:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

好厉害
小小子-396415 回答时间:2012-10-22 21:00:45

回复:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

楼主,求救啊~~~~~
SampsonKong 回答时间:2012-12-13 15:31:18

RE:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

MARK,研究一下
夹子鱼 回答时间:2012-12-13 15:59:31

回复:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

看看
yzhij 回答时间:2012-12-14 10:06:08

RE:我的毕设总结-用STM32的高速AD和USB2.0做简易示波器

楼主你好,我现在在做这个毕业设计,很急,能否指点下,

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版