一、多通道adc和dma的配置问题:
刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详细的资料。稍微改了一下官方的demo一下就编译成功了。这个例子的启示是:别忙着去网上找现成的例子,启示固件库里面的例程很给力了。
程序需求是开通三个adc通道分别采集3v 的基准电压、控制反馈温度和环境温度。
因为用示波器测试时发现ted控制pwm的开关的高频噪声耦合到控制地中来了,所以会有一些高频尖刺。我的解决办法是每组数据通过dma采集100个点,除去最大的10个数和最小的10数然后取平均值。
配置代码如下:
uint16_t rec_buff[100][3];
void dma_configuration(void)
{
dma_inittypedef dma_initstructure;
/* dma1 channel1 configuration ----------------------------------------------*/
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable);
dma_deinit(dma1_channel1); //dma重新设置为缺省值
dma_initstructure.dma_peripheralbaseaddr = adc1_dr_address;//dma??adc???
dma_initstructure.dma_memorybaseaddr = (uint32_t)&rec_buff; //dma数据填充的地址
dma_initstructure.dma_dir = dma_dir_peripheralsrc;//src模式,外设向内存中搬运
dma_initstructure.dma_buffersize = 300; //接收容量
dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; //外设地址是否增长,这里没有开启
dma_initstructure.dma_memoryinc = dma_memoryinc_enable;//接收地址储存地址是否自增长
dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_halfword; //搬运尺寸是16位
dma_initstructure.dma_memorydatasize = dma_memorydatasize_halfword;//dma搬运数字的大小
dma_initstructure.dma_mode = dma_mode_circular; //转换模式,循环缓存模式
dma_initstructure.dma_priority = dma_priority_high; //dma优先级高
dma_initstructure.dma_m2m = dma_m2m_disable; //m2m禁止
dma_init(dma1_channel1, &dma_initstructure);
dma_itconfig(dma1_channel1, dma_it_tc , enable);
/* enable dma1 channel1 */
dma_cmd(dma1_channel1, enable);
}
void adc_configuration(void)
{
adc_inittypedef adc_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_adc1 | rcc_apb2periph_afio, enable);
/* adc1 configuration ------------------------------------------------------*/
adc_initstructure.adc_mode = adc_mode_independent;
adc_initstructure.adc_scanconvmode = enable;
adc_initstructure.adc_continuousconvmode = enable;
adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none;
adc_initstructure.adc_dataalign = adc_dataalign_right;
adc_initstructure.adc_nbrofchannel = 3;
adc_init(adc1, &adc_initstructure);
adc_regularchannelconfig(adc1, adc_channel_1, 1, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc1, adc_channel_2, 2, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc1, adc_channel_4, 3, adc_sampletime_55cycles5);
/* enable adc1 dma */
adc_dmacmd(adc1, enable); //打开adc和dma的关联
/* enable adc1 */
adc_cmd(adc1, enable); //打开adc,可以通过“adc_cmd(adc1, disable); ”语句来关闭
/* enable adc1 reset calibration register */
adc_resetcalibration(adc1);
/* check the end of adc1 reset calibration register */
while(adc_getresetcalibrationstatus(adc1));
/* start adc1 calibration */
adc_startcalibration(adc1);
/* check the end of adc1 calibration */
while(adc_getcalibrationstatus(adc1));
/* start adc1 software conversion */
adc_softwarestartconvcmd(adc1, enable);
}
在调试的时候发现每个通道的数据经常会出现乱的现象:本来是通道一的数据出现到通道二之类的。后来一想可能是dma接收数据完后需要清零,所以在每次数据接收完毕后都会重新配置一下dma。
美版苹果13pro多少钱
TDA7449各引脚功能及电压
安科瑞泵吸式餐饮油烟在线监测仪如何安装?
OI-ES系列移动式电磁屏蔽箱的功能特点及应用范围
如何控制IC的功耗
一种基于stm32的多通道ADC和DMA的设置问题详解
2021年云原生及云计算的发展趋势
荣耀V40呈现非遗经典之中国华彩,不一样的色彩之美
汉司科技获数亿元A轮融资,加强半导体领域研发投入
win10自动更新怎么关闭
什么是“算力网络”?算力的分类
高压放大器是工作原理和功能支持-Pintech品致
光纤通信传输设备有哪些?传输光纤经过哪些设备?
“芯星计划”启动仪式暨大学生半导体行业就业研讨会成功举办
钢轮式耐磨试验机的技术参数
一文搞懂电感Isat、Irms以及测量方法
如何估算结构体和类的大小
CBA推聊天机器人 能处理200余种业务
对探索蛋白质折叠有了全新远景!
《2022中国低压电器市场白皮书》进行解析