本帖最后由 dzwwzd6699 于 2019-12-29 17:53 编辑
USB接口运用广泛,支持热插拔,适合做与上位机的通讯接口。HID 是USB的一个类,HID类驱动是系统自带的,无需安装其他驱动,通用性较强。笔者初次接触STM32 USB接口,参照并在官方例程上进行了修改,可能会有许多错误,欢迎各位大佬指正。
本设计比较简单,stm32f103通过USB接口获取波形参数,然后通过定时器触发DAC,产生特定的波形。
1.USB通讯配置
USB设备类型选HID类
根据描述符个数更改USBD_CUSTOM_HID_REPORT_DESC_SIZE,避免数组越界报错
2.DAC、DMA、TIM配置
STM32F1系列共有 8 个定时器,定时器6和定时器7是基本定时器,只能定时,没有外部 IO,主要用于驱动DAC。定时器2、3、4、5是通用定时器可以定时、输出比较和输入捕捉。定时器1和定时器8是高级定时器,可以定时、输出比较、输入捕捉,还可以有三相电机互补输出信号。本试验采用基本定时器7定时触发唤醒DAC.(8分频)
3.波形的生成
波形生成主要有两种方法,一种是将电压值写入数组中,定时器定时触发产生相应电压值;另一种是硬件生成特定波形。stm32f1系列可以硬件生成方波(PWM)和三角波,无法生成正弦波。数组法可以用Excel拟合曲线法,将电压值写入Flash,也可以用公式法求得固定步长下电压值并塞进数组中,相比之下公式法灵活性更高,可以实现振幅与周期的可控,但对运算速度要求较高。(函数还未优化,参数写死了,尤其是方波)
4.程序结构
stm32f103接受到上位机信号后,进入中断,在中断内改变全局变量myaction的值,主程序不断轮询myaction的值,并调用对应波形的电压值数组,通过定时器定时触发,输出对应电压值进行拟合。
标志位
主循环
根据官方的指南,stm32向电脑发送数据可以直接调用USBD_CUSTOM_HID_SendReport()的API,接受数据则要在中断函数CUSTOM_HID_OutEvent_FS中完成,故在中断中设置标志位,在主循环内轮询标志位,选择并生成对应波形的数组,后期将会完善中断和波形函数那一块,实现波形可控。还有一个坑是stm32f103c8没有DAC ,暂时还没法测试。
|