本帖最后由 ajfan 于 2019-11-10 22:00 编辑
请教各位专家,C8051F340 配置P1.2用于PCA 产生16位PWM,目前发现在屏蔽SPI0_Init() 或屏蔽SPI0_Init()内部SPI0CN = 0x01时,PWM可以正常输出,如果包含则PWM无反应,请各位朋友帮忙看下有可能的原因,不胜感谢。
主函数
PCA0MD &= ~0x40; //禁止看门狗
SYSCLK_Init();
PCA0_Init();
Uart0Init();
SPI0_Init();
Port_Init();
子函数
void SYSCLK_Init ()
{
unsigned int i=0;
CLKMUL=0x00;//复位4倍时钟乘法器
CLKMUL=0x00;//选择时钟乘法器的输入
CLKMUL|=0x80;//时钟乘法器使能,连接时钟乘法器的是内部振荡器
for(i=0;i<20;i++);// Wait 5us for initialization
CLKMUL|=0xC0;//初始化时钟乘法器
while((CLKMUL&0x20)==0);
CLKSEL=0X02;//0X03为4倍;0x02为2倍 系统时钟选择位
OSCICN=0x83;//内部振荡器输出为0x83--12MHz; 0x82--6MHz;0x81 3MHz
}
void SPI0_Init()
{
SPI0CFG = 0x60; //0X40
SPI0CN = 0x01; //0D
// The equation for SPI0CKR is (SYSCLK/(2*F_SCK_MAX))-1
SPI0CKR = (SYSCLK/(2*F_SCK_MAX)) - 1;
}
void PCA0_Init (void)
{
unsigned int Value ;
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x08; // Use SYSCLK as time base
PCA0CPM0 = 0xC2; // Module 0 = 16-bit PWM mode and
Value = 65536 - (65536 * 0.5); // Configure initial PWM duty cycle = 60%
PCA0CPL0 = (Value & 0x00FF);
PCA0CPH0 = (Value & 0xFF00)>>8;
CR = 1;
}
void Port_Init(void)
{
P0MDOUT = 0x56;
P1MDOUT = 0xFC; //P1.2 推挽输出
P2MDOUT = 0xF7;
P3MDOUT = 0xF0;
P4MDOUT = 0x01;
P0SKIP = 0x03;
XBR0 = 0x07;
XBR1 = 0xC1; //PCA 输出至 CEX0,连到端口引脚
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
非专业搞MCU,纯个人爱好自学,问题比较多。
经过modbus大神的指导,目前PWM可以在1.2输出,确实是NSS未使用需要人为skip一位,改正后PWM输出367HZ左右,占空比可调。
主函数调用顺序
SYSCLK_Init();
Port_Init();
PCA0_Init();
Uart0Init();
SPI0_Init();
Timer0_Init();
目前想调整PWM的频率,按手册说明可以通过定时器0溢出作为时钟源(PCA0MD = 0x08;改为PCA0MD = 0x04;),对应涉及uart 和 timer0以下修改,不过修改后PWM呈10HZ非正常输出,还请各位高手解惑。(uart功能正常)
一周热门 更多>