【Atmel SAM R21创意大赛周计划】03 TC+ADC+PWM更新

johnrey   2015-3-12 12:31 楼主
原计划做的是一个无线音频传输,基本架构是一个R21定时采集声音电压,然后通过无线发送到接收端;接收端R21也是定时利用接收缓冲里面的数据,去更新pwm的占空比,从而实现一个无线声音传输的效果(谁让R21没有DAC呢)。


整个过程分为两个步骤进行,一个是本地的ADC定时采集,然后直接去更新同一块R21上的PWM占空比;第二部是把验证好ADC和PWM分拆到两个模块,用无线连接,就搞定了。首先来完成第一部分。


有ASF的话,这些过程还简单的呢,添加TC、TCC和ADC模块。其中TC和ADC使用callback,TCC使用poll。由于采样频率和PWM频率是独立的,所以用了TC+TCC。
00 asf.png
然后就是参照asf文档来配置各个模块了。首先是TC。使用GCLK_GENERATOR_0,8bit模式。系统默认上电使用的是8M的RC晶振。做8分频,周期125,正好得到8K的时钟,通过io口翻转验证通过。
01 tc config.png
然后把adc_read_buffer_job(&adc_instance, &result, 1)添加到tc的callback函数中,就实现了定时采集ADC了。adc配置如下。使用1/2VCC做参考,但是输入有1/2gain,其实可测范围就是从0-3.3V。
02 adc config.png
不过调试定时器+ADC的时候却发现,虽然ADC的采集时间在8M下大概是26us,可是8K的频率去采样(周期有125us呢)却没法成功,只要降低频率到2K左右就可以。所以为了加快ADC速度,又使用了一个clock manage模块。但是利用asf文档所说的例程去设定48M的时候,却只得到了28.8M的运行频率,一直没有找到原因。不过也凑合能用。设定是64分频,period=57的时候,可以得到8K的时钟。这时候采集正常。


接下来就是把tcc_set_compare_value(&tcc_instance,CONF_PWM_CHANNEL,result);放到adc的callback中,adc转换一完成,就根据采集到的数据区更改PWM的占空比,为了和ADC采集8位匹配,PWM的counter.period 设为0xFF。其他使用默认配置。
03 tcc config.png
需要说明的是,asf例程文档中,pwm的宏定义是注释掉的这些,其实是不对的,应该改成上面那5行。其实这个也可以在附近的文档找到。
04 tcc ee.png
最后烧写进去,先利用一个电位器代替输入信号,可以发现PWM能够根据输入电压的变化动作。明天上信号发生器试试。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复