首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAMD21如何使用TCC设置脉宽调制?

SAMD21如何使用TCC设置脉宽调制?
EN

Stack Overflow用户
提问于 2020-05-27 17:05:35
回答 2查看 476关注 0票数 1

我正在编程SAMD21,当我选择带F函数的引脚时需要脉宽调制输出: PA22 -tc0/WO4 4 PA23 - TCC0 0/WO4 5

我成功配置了TCC0基本计数器:

代码语言:javascript
复制
// enable clock for TCC0 - disable clock masking
PM->APBCMASK.reg |= PM_APBCMASK_TCC0;

// set GCLK1 as source to the TCC0 counter
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(1) | GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_ID(0x1A);
while(!SYSCTRL->PCLKSR.bit.DFLLRDY);

// set counter
TCC0->CTRLA.reg |= TCC_CTRLA_PRESCALER_DIV64; // setting prescaler
TCC0->WAVE.reg |=  TCC_WAVE_WAVEGEN_NPWM | TCC_WAVE_POL0;
while (TCC0->SYNCBUSY.bit.WAVE);

// set TOP (PER) value of counter - frequency
TCC0->CTRLA.bit.RESOLUTION = 0;
TCC0->PER.reg = 48'000'000 / (100 * 64) - 1; // Fpwm = Fglk / (PRESC(PER+1))  --> PER = Fglk / (Fpwm * PRESC) - 1
while (TCC0->SYNCBUSY.bit.PER);

但问题是如何配置比较通道- SAMD21只有4个比较通道(CC),但我希望输出到WO4和WO5。

如何将给定的比较通道连接到WOx管脚?

感谢您的答复

编辑:

我还配置了多路复用的引脚(不确定是否正确):

代码语言:javascript
复制
PORT->Group[0].PINCFG->reg |= (1 << PIN_PA22) | (1 << PIN_PA23);
PORT->Group[0].PMUX->bit.PMUXE = (0x5 << (PIN_PA22/2));
PORT->Group[0].PMUX->bit.PMUXO = (0x5 << (PIN_PA23/2 + 1));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-20 17:12:01

有一个可以重用代码的PWM library;它附带一个表(在“extras”下),其中包含计时器、输出引脚、输出通道、引脚多路复用器等。

这个库(由我)是为基于SAMD21G的Arduinos编写的,但是您需要的所有映射和代码都在那里,它可能会对您的工作有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2020-05-27 18:30:02

注意:PORT->Group[0].PMUX是一个数组!如果使用PMUX->bit,它会衰减为指向第一个元素的指针,所以它会进行编译,但它是错误的。您正在设置第一个元素,而不是您感兴趣的引脚PIN_PA22/2

ASF寄存器映射中的路由PMUX寄存器类型如下所示:

代码语言:javascript
复制
typedef union {
  struct {
    uint8_t  PMUXE:4;          /*!< bit:  0.. 3  Peripheral Multiplexing for Even-Numbered Pin */
    uint8_t  PMUXO:4;          /*!< bit:  4.. 7  Peripheral Multiplexing for Odd-Numbered Pin */
  } bit;                       /*!< Structure used for bit  access                  */
  uint8_t reg;                 /*!< Type      used for register access              */
} PORT_PMUX_Type;

这意味着您可以写入8位reg或4位bit半字节。你似乎是在做后者。如果0x05是通过手册获得的“幻数”,那么您应该将此数字同时写入“偶数”和“奇数”半字节。这就是:

代码语言:javascript
复制
PORT->Group[0].PMUX[PIN_PA22/2].bit.PMUXE = (0x5 << 4);
PORT->Group[0].PMUX[PIN_PA22/2].bit.PMUXO = (0x5 << 0);

或者,如果你愿意,你也可以使用毫无意义的ASF膨胀软件宏来隐藏“可怕的”位逻辑:

代码语言:javascript
复制
PORT->Group[0].PMUX[PIN_PA22/2].reg = PORT_PMUX_PMUXE(0x5) | PORT_PMUX_PMUXO(0x5);

如果你没有做好这些,引脚上就不会有任何活动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62039356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档